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

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

前回またしてもPHPからヘッドレスブラウザの操作に失敗してしまいました😥
手ごたえとしてはもう少しのような気がするのですがなかなかうまくできません。

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

今回は(も?)原因を特定するところからスタートします。

原因調査

「処理がタイムアウト」みたいなエラーが発生しているようです。
この観点を軸に調査すると以下のページを発見できました。

headless-chromium-php – githubmemory

  $browser = $factory->createBrowser([
         'debugLogger' => 'php://stdout',
      'sendSyncDefaultTimeout' => 5000
]);

タイムアウトの時間が短すぎたのかな🤔

オプションにタイムアウトの設定項目(sendSyncDefaultTimeout)があるようです。

これを長くすればあるいは・・・

試してみた

タイムアウトのエラーでは5sec(秒)というふうに出ていました。
なので倍の10secに設定したいと思います。
sendSyncDefaultTimeoutの値は「ミリセカンド」で指定するようです。
1,000ミリセカンドで1秒なので10,000に設定しました。

// for Docker option
$options = [
    'headless' => true,
    'noSandbox' => true ,
    'sendSyncDefaultTimeout' => 10000,
];

さてどうなるでしょうか。

確認

今回こそはうまくいってほしい!と願いつつ http://localhost:8099/index.php にアクセスしました。
ん?画面に何も表示されない(´・ω・`)
失敗かな?と思いVS Codeのツリーを見たら出力結果がありました!

今回出力したのは画像(bar.png)とPDFです。(bar.pdf)です。
ちゃんとファイルができました😂

内容も確認してみました。
Googleのトップページと思われる画面が出力されていました!

bar.png

bar.pdf

 

ついに成功!

ようやく成功にたどり着きました。

苦労した部分をまとめておきます。

  • composerでinstallしたライブラリを使用する際は「require 'vendor/autoload.php’;」を実装する必要あり。
  • Dockerコンテナでchromiumを実行するときは「noSandbox」のオプションを指定する(※セキュリティ的にはよくないとのこと)
  • マシンスペックがあまり高くない場合はsendSyncDefaultTimeoutを設定してタイムアウト時間を延ばす。
  • BrowserFactoryをインスタンス化する際はchromiumのパスを渡す(環境変数で設定済みの場合は省略できる)
    • whereis chromium コマンドで絶対パスを見つけることができます。

というところでしょうか。本当に成功してよかった!

まだ問題あり

出力された画像をよく見るとなにかおかしな点があるかと思います。

画像を見ると一部文字化けしていて□マークになっています。
また、「English」というのもきになりました。

文字化けしているのはchromiumをインストールした環境に日本語フォントがインストールされていないのが原因のようです。

Docker でヘッドレス Chrome を動かしてみた

Englishと表示されるのはなんでしょうね。リクエスト時に「lang」の設定が漏れているからでしょうか。
あまり気にしないでおきましょう😑

まとめ

PHPからヘッドレスブラウザの操作を確認しました。

結果は成功!やっと本題のプラグイン開発に戻れる・・・。
と思ったのですがまだ文字化けの問題が解消していないのでなんとかしたいと思います。

また「ユーザエージェント」についてもちゃんと設定してあげようと思います。

今日はここまで!