PHPackages                             aktuba/php-puppeteer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. aktuba/php-puppeteer

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

aktuba/php-puppeteer
====================

Extend puphpeteer

0.1.0.9(6y ago)182.6k↓78.6%6[4 issues](https://github.com/aktuba/php-puppeteer/issues)MITPHPPHP &gt;=7.1

Since Mar 19Pushed 6y ago1 watchersCompare

[ Source](https://github.com/aktuba/php-puppeteer)[ Packagist](https://packagist.org/packages/aktuba/php-puppeteer)[ RSS](/packages/aktuba-php-puppeteer/feed)WikiDiscussions master Synced yesterday

READMEChangelog (5)Dependencies (1)Versions (6)Used By (0)

PhpPupeeteer
============

[](#phppupeeteer)

PhpPupeeteer based on Puppeteer. A [Puppeteer](https://github.com/GoogleChrome/puppeteer/) bridge for PHP, supporting the entire API. Based on [Rialto](https://github.com/nesk/rialto/), a package to manage Node resources from PHP.

Here are some examples [borrowed from Puppeteer's documentation](https://github.com/GoogleChrome/puppeteer/blob/master/README.md#usage) and adapted to PHP's syntax:

**Example** - navigating to  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();
```

Requirements and installation
-----------------------------

[](#requirements-and-installation)

This package requires PHP &gt;= 7.1 and Node &gt;= 8.

Install it with these two command lines:

```
composer require aktuba/php-puppeteer
npm install @nesk/puphpeteer
```

Notable differences between PhpPupeeteer and Puppeteer
------------------------------------------------------

[](#notable-differences-between-phppupeeteer-and-puppeteer)

### Puppeteer's class must be instanciated

[](#puppeteers-class-must-be-instanciated)

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](https://github.com/nesk/rialto/blob/master/docs/api.md#options). 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
]);
```

### No need to use the `await` keyword

[](#no-need-to-use-the-await-keyword)

With PhpPupeeteer, every method call or property getting/setting is synchronous.

### Some methods have been aliased

[](#some-methods-have-been-aliased)

The following methods have been aliased because PHP doesn't support the `$` character in method names:

- `$` =&gt; `querySelector`
- `$$` =&gt; `querySelectorAll`
- `$x` =&gt; `querySelectorXPath`
- `$eval` =&gt; `querySelectorEval`
- `$$eval` =&gt; `querySelectorAllEval`

Use these aliases just like you would have used the original methods:

```
$divs = $page->querySelectorAll('div');
```

### Evaluated functions must be created with `\PhpPupeeteer\Data\Js`

[](#evaluated-functions-must-be-created-with-phppupeeteerdatajs)

Functions evaluated in the context of the page must be written [with the `JsFunction` class](https://github.com/nesk/rialto/blob/master/docs/api.md#javascript-functions), 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")
;
```

### Exceptions must be catched with `->tryCatch`

[](#exceptions-must-be-catched-with--trycatch)

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.

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE) for more information.

###  Health Score

28

—

LowBetter than 52% of packages

Maintenance16

Infrequent updates — may be unmaintained

Popularity26

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 92.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~28 days

Total

5

Last Release

2551d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6d39ff77d19132e3f74b77c941b83b1c7898a0aa74a3e347e0d5fdaecedf14e4?d=identicon)[aktuba](/maintainers/aktuba)

---

Top Contributors

[![aktuba](https://avatars.githubusercontent.com/u/423239?v=4)](https://github.com/aktuba "aktuba (24 commits)")[![xtrime-ru](https://avatars.githubusercontent.com/u/34161928?v=4)](https://github.com/xtrime-ru "xtrime-ru (2 commits)")

### Embed Badge

![Health badge](/badges/aktuba-php-puppeteer/health.svg)

```
[![Health](https://phpackages.com/badges/aktuba-php-puppeteer/health.svg)](https://phpackages.com/packages/aktuba-php-puppeteer)
```

###  Alternatives

[jaeger/querylist-puppeteer

QueryList Plugin: Use Puppeteer to crawl Javascript dynamically rendered pages.(Headless Chrome ) 使用Puppeteer采集JavaScript动态渲染的页面

2271.4k](/packages/jaeger-querylist-puppeteer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
