PhpPupeeteer based on Puppeteer. A Puppeteer bridge for PHP, supporting the entire API. Based on Rialto, a package to manage Node resources from PHP.
Here are some examples borrowed from Puppeteer's documentation and adapted to PHP's syntax:
Example - navigating to https://example.com and saving a screenshot as example.png:
use PhpPupeeteer\PhpPupeeteer;
$phpPuppeteer = new PhpPupeeteer;
$browser = $phpPuppeteer->getBrowser([
'args' => [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu',
'--incognito',
],
]);
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();
Example - show browser window
use PhpPupeeteer\PhpPupeeteer;
$phpPuppeteer = new PhpPupeeteer;
$browser = $phpPuppeteer->getBrowser([
'headless' => false,
'args' => [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--incognito',
'--start-maximized',
],
]);
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');
$page->screenshot(['path' => 'example.png']);
$browser->close();
Example - evaluate a script in the context of the page:
use Puphpeteer\Puppeteer;
use Puphpeteer\Data\Js;
$puppeteer = new PhpPupeeteer;
$browser = $phpPuppeteer->getBrowser();
$page = $browser->newPage();
$page->gotoWithWait('https://example.com');
// Get the "viewport" of the page, as reported by the page.
$dimensions = $page->evaluate(Js::createWithBody("
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
};
"));
printf('Dimensions: %s', print_r($dimensions, true));
$browser->close();
This package requires PHP >= 7.1 and Node >= 8.
Install it with these two command lines:
composer require aktuba/php-puppeteer
npm install @nesk/puphpeteer
Instead of requiring Puppeteer:
const puppeteer = require('puppeteer');
You have to instanciate the PhpPupeeteer
class:
use PhpPupeeteer\PhpPupeeteer;
$puppeteer = PhpPupeeteer;
This will create a new Node process controlled by PHP.
You can also pass some options to the constructor, see Rialto's documentation. PuPHPeteer also extends these options:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
'log_browser_console' => false,
]
⏱ Want to use some timeouts higher than 30 seconds in Puppeteer's API?
If you use some timeouts higher than 30 seconds, you will have to set a higher value for the read_timeout
option (default: 35
):
$phpPuppeteer = $phpPuppeteer->getBrowser([
'read_timeout' => 65, // In seconds
]);
$browser->newPage()->goto($url, [
'timeout' => 60000, // In milliseconds
]);
With PhpPupeeteer, every method call or property getting/setting is synchronous.
The following methods have been aliased because PHP doesn't support the $
character in method names:
$
=>querySelector
$$
=>querySelectorAll
$x
=>querySelectorXPath
$eval
=>querySelectorEval
$$eval
=>querySelectorAllEval
Use these aliases just like you would have used the original methods:
$divs = $page->querySelectorAll('div');
Functions evaluated in the context of the page must be written with the JsFunction
class, the body of these functions must be written in JavaScript instead of PHP.
use PhpPupeeteer\Data\Js;
$pageFunction = Js::createWithParameters(['element'])
->body("return element.textContent")
;
If an error occurs in Node, a Node\FatalException
will be thrown and the process closed, you will have to create a new instance of Puppeteer
.
To avoid that, you can ask Node to catch these errors by prepending your instruction with ->tryCatch
:
use Nesk\Rialto\Exceptions\Node;
try {
$page->tryCatch->goto('invalid_url');
} catch (Node\Exception $exception) {
// Handle the exception...
}
Instead, a Node\Exception
will be thrown, the Node process will stay alive and usable.
The MIT License (MIT). Please see License File for more information.