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

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Statamic Mailables Viewer Previews Laravel Emails in the Control Panel image

Statamic Mailables Viewer Previews Laravel Emails in the Control Panel

Read article
Laravel Tackle: Run an AI Coding Agent in Your Laravel App image

Laravel Tackle: Run an AI Coding Agent in Your Laravel App

Read article
Queue::forward(): Reroute Laravel Queues in One Place image

Queue::forward(): Reroute Laravel Queues in One Place

Read article
Laravel Read-Through Filesystem: Lazy Storage Migration image

Laravel Read-Through Filesystem: Lazy Storage Migration

Read article
Read-Through Disks and Debounced Listeners in Laravel 13.26 image

Read-Through Disks and Debounced Listeners in Laravel 13.26

Read article
Lerd: A Free, Open Source Herd Alternative for Linux and macOS image

Lerd: A Free, Open Source Herd Alternative for Linux and macOS

Read article