Puphpeteer: A Puppeteer bridge for PHP
Published on by Paul Redmond
PuPHPeteer by Johann Pardanaud is PHP bridge for Google Chrome’s Puppeteer headless chrome Node.js API. PuPHPeteer is based on another package by Johann called Rialto, which is a package to manage Node resources from PHP.
Examples
PuPHPeteer has similar PHP examples based on the Puppeteer examples, to get a feel for how you might use the API in PHP.
Here’s an example of navigating to a page and taking a screenshot:
use Nesk\PuPHPeteer\Puppeteer; $puppeteer = new Puppeteer;$browser = $puppeteer->launch(); $page = $browser->newPage();$page->goto('https://example.com');$page->screenshot(['path' => 'example.png']); $browser->close();
Here’s an example of evaluation a script in the context of a page:
use Nesk\PuPHPeteer\Puppeteer;use Nesk\Rialto\Data\JsFunction; $puppeteer = new Puppeteer; $browser = $puppeteer->launch();$page = $browser->newPage();$page->goto('https://example.com'); // Get the "viewport" of the page, as reported by the page.$dimensions = $page->evaluate(JsFunction::create(" return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, deviceScaleFactor: window.devicePixelRatio };")); printf('Dimensions: %s', print_r($dimensions, true)); $browser->close();
Differences
The most significant difference, in my opinion, is that in every method call and getter/setter in PuPHPeteer is synchronous.
Although PuPHPeteer supports the full Node API, there are a few implementation differences. The biggest is creating a new Puppeteer;
instance instead of using require('puppeteer')
in Node. When you create an instance using new Puppeteer;
it creates a new Node process controlled by PHP.
Next, you can pass configuration options to the constructor:
[ // Node's executable path 'executable_path' => 'node', // How much time (in seconds) the process can stay inactive before being killed 'idle_timeout' => 60, // How much time (in seconds) an instruction can take to return a value 'read_timeout' => 30, // How much time (in seconds) the process can take to shutdown properly before being killed 'stop_timeout' => 3, // A logger instance for debugging (must implement \Psr\Log\LoggerInterface) 'logger' => null, // Enables debugging mode: // - adds the --inspect flag to Node's command // - appends stack traces to Node exception messages 'debug' => false,]
PuPHPeteer requires PHP >= 7.1
and Node >= 8
. Check out the GitHub repo for the full readme and installation instructions. Great job Johann!