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!