News

Puphpeteer: A Puppeteer bridge for PHP

Published
Puphpeteer: A Puppeteer bridge for PHP image

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!

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Filed in

Sponsored

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
Volker Dusch on the PHP RCE Vulnerabilities and Disclosure image

Volker Dusch on the PHP RCE Vulnerabilities and Disclosure

Read article
Decide with Jev: Turn AI Answers into Decisions with PHP Rules image

Decide with Jev: Turn AI Answers into Decisions with PHP Rules

Read article
Skuul: Open-Source School Management Built on Laravel image

Skuul: Open-Source School Management Built on Laravel

Read article
Laravel Read Replicas: Prevent Stale Reads After a Write image

Laravel Read Replicas: Prevent Stale Reads After a Write

Read article
Screenshot: Capture Images and PDFs with PHP and Laravel image

Screenshot: Capture Images and PDFs with PHP and Laravel

Read article
Reset Sticky Database Connections Between Laravel Queue Jobs image

Reset Sticky Database Connections Between Laravel Queue Jobs

Read article