If you want a function that will return the result of a PhantomJS script, you may find this handy.

It takes an array of options to be passed as arguments to the phantomJS file, executes it, and returns its results.

I guess you have already installed phantomJS on your server, and configured it to run with no problems for the current user, right?

Here is the code:

<?php
/**
* To get this to work on my server for user "axxis" I had to edit /etc/sudoers and add:
* axxis ALL=(ALL) NOPASSWD: /usr/bin/phantomjs
**/
// // Enable Error Reporting
// ini_set('display_errors',1);
// ini_set('display_startup_errors',1);
// error_reporting(-1);

// A check to see that console commands work. Displays also the current user
//$user = exec("whoami");
//echo "Current user: ".$user;

// the important stuff...
function callPhantom($options) {
    $proxySettings     = isset($options['proxy']) ? $options['proxy'] : ''; //"--proxy=ip:port --proxy-type=https";
    $scripttoload     = $options['phantomfile']; // phantomjs script that loads the url
    $URLtoload         = $options['url']; // the url with the jacascript
    $Referer        = isset($options['referer']) ? $options['referer'] : ''; //'Me';
    $UserAgent        = isset($options['useragent']) ? $options['useragent'] : ''; //'MyBrowser';
    if ($options['args']) { // any args you want to send to the loaded url, eg. time=198322
        $args = '';
        foreach ($options['args'] as $arg) {
            $args .= escapeshellarg($now); // Don't forget to escape args!
        }
    } // To grab the args in the js file, that's another story (and another article!) ;)

    $cmd = 'phantomjs' . ' '
         . $proxy . ' '
         . "--web-security=no" . ' '
         . $scripttoload . ' '
         . $args . ' '
         . escapeshellarg($URLtoload) . ' '
         . escapeshellarg($Referer) . ' '
         . escapeshellarg($UserAgent) . ' '
         . ' 2>&1'; // let's capture STDERR as well
    
    // execute phantomjs script, let the javascript on this page execute,
    // and get the finished page in a variable: $code_of_loaded_content
    exec($cmd, $op, $er);
    $code_of_loaded_content = implode("",$op);
    if (!empty($er)) {
        echo "<h1>ERRORS</h1>";
        echo $er;
    }
    //echo "<h1>RESULT</h1>";
    return $code_of_loaded_content;
}
// EXAMPLE
/*
echo callPhantom(array(
    'phantomfile' => DIRNAME(__FILE__).'/take_screenshot.js',
    'url' => 'http://chrismichaelides.eu/'
));
*/
?>

The function passes the given options over to the phantom js file, but to see how they are being handled, you'll have to wait for the next article! :)

Leave a Reply   

The Sinner In Me (Chris Vulture Mix) by Chris Vulture on Mixcloud