PHP 初心者が WordPress の プラグイン 作成 ! part16 ( PHPからヘッドレスブラウザ操作 失敗 )

この記事では PHP 初心者 が WordPress プラグイン を 作成 します。 part16 ではPHPからヘッドレスブラウザを操作してみようと思います。

前回はPHPの環境にヘッドレスブラウザのchromiumとPHPライブラリをインストールしました。

PHP 初心者が WordPress の プラグイン 作成 ! part15 ( PHPライブラリと ヘッドレスブラウザをインストール )

今回はPHPからヘッドレスブラウザの操作に挑戦してみたいと思います。

実装

実装は以下のサイトを参考にさせていただきました。

headless-chromium-phpを使ってみる

今回は検証なので開発用のwordpressに手を加えるのではなくこの環境が構築されたときから存在するindex.phpに実装を行いたいと思います。

Googleのトップページを画像とPNGで取得する実装にしました。

index.php

<?php
// $a = 1;
// if ($a === 1) {
//     echo "ほげ";
// } else {
//     echo "fuga";
// }

use HeadlessChromium\BrowserFactory;

$browserFactory = new BrowserFactory();

// starts headless chrome
$browser = $browserFactory->createBrowser();

// creates a new page and navigate to an url
$page = $browser->createPage();
$page->navigate('https://www.google.co.jp')->waitForNavigation();

// get page title
$pageTitle = $page->evaluate('document.title')->getReturnValue();

// screenshot
$page->screenshot()->saveToFile('/var/www/html/bar.png');

// pdf
$page->pdf(['printBackground'=>false])->saveToFile('/var/www/html/bar.pdf');

// bye
$browser->close();

?>

ほんとうにうまくいくのでしょうか・・・。

確認

それではアクセスしてみます。

http://localhost:8099/index.php

だめでした😓

悩む

やはり参考にさせていただいた記事そのままではダメみたいです。

PHPライブラリの本家にも同じような記事がありました。

chrome-php/chrome

なにかが・・・足りないとcomposerについて調べているとこんな記事を発見。

Composerでライブラリを試す手順

// autoloadを読み込む
require 'vendor/autoload.php';

これだ😳

さっそく実装して確認です!

再確認

Oh…

Fatal error: Uncaught RuntimeException: Chrome process stopped before startup completed. Additional info: sh: 1: exec: chrome: not found in /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php:390 Stack trace: 
#0 /var/www/html/vendor/chrome-php/chrome/src/Utils.php(55): HeadlessChromium\Browser\BrowserProcess->HeadlessChromium\Browser\{closure}(Object(Symfony\Component\Process\Process)) 
#1 /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(425): HeadlessChromium\Utils::tryWithTimeout(30000000, Object(Generator)) 
#2 /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(137): HeadlessChromium\Browser\BrowserProcess->waitForStartup(Object(Symfony\Component\Process\Process), 30000000) 
#3 /var/www/html/vendor/chrome-php/chrome/src/BrowserFactory.php(73): HeadlessChromium\Browser\BrowserProcess->start('chrome', Array) 
#4 /var/www/html/index.php(17): HeadlessChromium\BrowserFactory->createBrowser() 
#5 {main} thrown in /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php on line 390

このエラーは new BrowserFactoryの引数でchromiumまでのパスを渡してあげないといけないというエラーのようです。
※環境変数にCHROME_PATHを定義すると引数を省略できるそうです。

こんな風にしました。

$browserFactory = new BrowserFactory('/usr/bin/chromium');

そして実行!

なんだかものすごく長いエラーが(´・ω・`)

Fatal error: Uncaught RuntimeException: Chrome process stopped before startup completed. Additional info: Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted [0521/120355.995483:FATAL:zygote_host_impl_linux.cc(190)] Check failed: ReceiveFixedMessage(fds[0], kZygoteBootMessage, sizeof(kZygoteBootMessage), &boot_pid). 
#0 0x5613ad911d09 (/usr/lib/chromium/chromium+0x5b4ad08) 
#1 0x5613ad87df73 (/usr/lib/chromium/chromium+0x5ab6f72) 
#2 0x5613ad8915e2 (/usr/lib/chromium/chromium+0x5aca5e1) 
#3 0x5613ad89200e (/usr/lib/chromium/chromium+0x5acb00d) 
#4 0x5613abf72a6f (/usr/lib/chromium/chromium+0x41aba6e) 
#5 0x5613ad857a0f (/usr/lib/chromium/chromium+0x5a90a0e) 
#6 0x5613ab67fcb6 (/usr/lib/chromium/chromium+0x38b8cb5) 
#7 0x5613ab680211 (/usr/lib/chromium/chromium+0x38b9210) 
#8 0x5613ad856ec2 (/usr/lib/chromium/chromium+0x5a8fec1) 
#9 0x5613ad8553af (/usr/lib/chromium/chromium+0x5a8e3ae) 
#10 0x5613ad8554ee (/usr/lib/chromium/chromium+0x5a8e4ed) 
#11 0x5613ad877824 (/usr/lib/chromium/chromium+0x5ab0823) 
#12 0x5613ad877553 (/usr/lib/chromium/chromium+0x5ab0552) 
#13 0x5613aac2818c ChromeMain 
#14 0x7f9f3c23f09b __libc_start_main 
#15 0x5613aac2802a _start Received signal 6 
#0 0x5613ad911d09 (/usr/lib/chromium/chromium+0x5b4ad08) 
#1 0x5613ad87df73 (/usr/lib/chromium/chromium+0x5ab6f72) 
#2 0x5613ad911891 (/usr/lib/chromium/chromium+0x5b4a890) 
#3 0x7f9f41d22730 (/lib/x86_64-linux-gnu/libpthread-2.28.so+0x1272f) 
#4 0x7f9f3c2527bb gsignal 
#5 0x7f9f3c23d535 abort 
#6 0x5613ad9106f5 (/usr/lib/chromium/chromium+0x5b496f4) 
#7 0x5613ad8919f3 (/usr/lib/chromium/chromium+0x5aca9f2) 
#8 0x5613ad89200e (/usr/lib/chromium/chromium+0x5acb00d) 
#9 0x5613abf72a6f (/usr/lib/chromium/chromium+0x41aba6e) 
#10 0x5613ad857a0f (/usr/lib/chromium/chromium+0x5a90a0e) 
#11 0x5613ab67fcb6 (/usr/lib/chromium/chromium+0x38b8cb5) 
#12 0x5613ab680211 (/usr/lib/chromium/chromium+0x38b9210) 
#13 0x5613ad856ec2 (/usr/lib/chromium/chromium+0x5a8fec1) 
#14 0x5613ad8553af (/usr/lib/chromium/chromium+0x5a8e3ae) 
#15 0x5613ad8554ee (/usr/lib/chromium/chromium+0x5a8e4ed) 
#16 0x5613ad877824 (/usr/lib/chromium/chromium+0x5ab0823) 
#17 0x5613ad877553 (/usr/lib/chromium/chromium+0x5ab0552) 
#18 0x5613aac2818c ChromeMain 
#19 0x7f9f3c23f09b __libc_start_main 
#20 0x5613aac2802a _start r8: 0000000000000000 r9: 00007ffd88020510 r10: 0000000000000008 r11: 0000000000000246 r12: 00005613b3271800 r13: 00005613b3271810 r14: 00007ffd88020fe0 r15: 00000000000000a0 di: 0000000000000002 si: 00007ffd88020510 bp: 00007ffd88020760 bx: 0000000000000006 dx: 0000000000000000 ax: 0000000000000000 cx: 00007f9f3c2527bb sp: 00007ffd88020510 ip: 00007f9f3c2527bb efl: 0000000000000246 cgf: 002b000000000033 erf: 0000000000000000 trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000 [end of stack trace] Calling _exit(1). Core file will not be generated. in /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php:390 Stack trace: 
#0 /var/www/html/vendor/chrome-php/chrome/src/Utils.php(55): HeadlessChromium\Browser\BrowserProcess->HeadlessChromium\Browser\{closure}(Object(Symfony\Component\Process\Process)) 
#1 /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(425): HeadlessChromium\Utils::tryWithTimeout(30000000, Object(Generator)) 
#2 /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php(137): HeadlessChromium\Browser\BrowserProcess->waitForStartup(Object(Symfony\Component\Process\Process), 30000000) 
#3 /var/www/html/vendor/chrome-php/chrome/src/BrowserFactory.php(73): HeadlessChromium\Browser\BrowserProcess->start('/usr/bin/chromi...', Array) 
#4 /var/www/html/index.php(17): HeadlessChromium\BrowserFactory->createBrowser() 
#5 {main} thrown in /var/www/html/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php on line 390

・・・今日はもう諦めます。

まとめ

PHPからヘッドレスブラウザを操作してみるつもりでしたが残念ながらエラーで進めませんでした。

現時点でのindex.phpの状態です。

<?php
// $a = 1;
// if ($a === 1) {
//     echo "ほげ";
// } else {
//     echo "fuga";
// }

// autoloadを読み込む
require 'vendor/autoload.php';

use HeadlessChromium\BrowserFactory;

// whereis chromiumでパスを探した
$browserFactory = new BrowserFactory('/usr/bin/chromium');

// starts headless chrome
$browser = $browserFactory-<createBrowser();

// creates a new page and navigate to an url
$page = $browser-<createPage();
$page-<navigate('https://www.google.co.jp')-<waitForNavigation();

// get page title
$pageTitle = $page-<evaluate('document.title')-<getReturnValue();

// screenshot
$page-<screenshot()-<saveToFile('/var/www/html/bar.png');

// pdf
$page-<pdf(['printBackground'=<false])-<saveToFile('/var/www/html/bar.pdf');

// bye
$browser-<close();

?<

このあたりの記事が参考になりそうな気がします。

なるべく人間に似せてスクレイピングする方法

なんとか頑張って解決したいと思います😄

今日はここまで!