PHP PhantomJSで上手く結果が返ってこなかった際に確認すべきこと
2018-08-02 2018-08-29
仮想ブラウザ的な何かでごにょごにょしろ的な依頼を受けたので、仕方なくPhantomJSを利用することにしました。
PhantomJSはヘッドレス(画面が無い)ブラウザとして有名ですが、今回はPHPのアプリケーションをメインで使っているサーバで使いたいとの話だったので、PHP PhantomJSという、PHPからPhantomJSを使うためのライブラリを利用してごにょごにょすることになりました。
が、実際に使ってみたら、エラーやらエラーは出ないけど上手く情報が取れないやらで、問題が山積み。
仕方なく、その問題を一つ一つ解決していって実用までこぎつけたので、その解決方法を共有したいと思います。
PHP PhantomJSのインストール
公式サイトにも書かれていますが、PHP PhantomJSはcomposerでインストールします。
1 2 3 4 5 6 7 8 9 10 11 |
"scripts": { "post-install-cmd": [ "PhantomInstaller\\Installer::installPhantomJS" ], "post-update-cmd": [ "PhantomInstaller\\Installer::installPhantomJS" ] }, "config": { "bin-dir": "bin" } |
1 |
composer require "jonnyw/php-phantomjs:4.*" |
公式サイトに書かれているとおりです。composer.json作ってインストールします。
vendorディレクトリが生成され、中にPHP PhantomJSに必要なファイル一式が入ります。
PHP PhantomJSの使い方
インストールが完了したら、サンプルのphpファイルを作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php require 'vendor/autoload.php'; use JonnyW\PhantomJs\Client; $client = Client::getInstance(); $request = $client->getMessageFactory()->createRequest(); $response = $client->getMessageFactory()->createResponse(); $url = 'http://適当なサイト'; $request->setUrl($url); $client->getEngine()->setPath('bin/phantomjs.exe'); $client->send($request,$response); $content = $response->getContent(); echo $content; ?> |
注意点は15行目のsetPath、ここでphantomjs.exeの場所を指定してあげないとエラーになります。
これを指定しないと「Error when executing PhantomJs procedure – File does not exist or is not executable: bin/phantomjs」みたいなエラーがでます。
これでindex.phpを実行すれば、適当なサイトのHTML情報がごそっと取れ…ません。
「File does not exist or is not executable」というエラーが返ってきました。
PHP PhantomJS実行ファイルのパーミッションを確認
「File does not exist or is not executable」の意味は、「ファイルが無いか実行できないよ」という意味です。
ファイルは間違いなくあるので、実行出来ないということでしょう。ということでパーミッションを確認したところ、実行権限が付加されていませんでした。
ということで、sshでもftpでも良いので、exeファイルに実行権限を与えてあげます。
今度こそ、適当なサイトのHTML情報がごそっと取れ…ません。今度はエラーこそ無いものの、何も情報が返ってきていません。
PHP PhantomJSの実行結果をdebugモードで確認する
1 2 3 |
$client->getEngine()->debug(true); // デバッグON $client->send($request,$response); // 実行 echo $client->getLog(); // ログ出力 |
エラーは出ないけど何も帰ってこないという状況になる方が多いかと思います。
ということで、問題を確認するためにデバッグをonにして確認します。
私の場合は「sh: ./bin/phantomjs.exe: cannot execute binary file」というエラーが発生していました。
「お前のphantomjs.exeってOSに対応してない実行ファイルじゃないの?」という意味のエラーです。
Linux環境でWindows用のexeファイルを実行しようとしていたことにここで気づきます。
PHP PhantomJSの実行ファイルを環境に合わせる
http://phantomjs.org/download.htmlで、環境に合わせたファイルをダウンロードして、bin以下にセットします。ローカルならともかく、どこかのサーバに置くのであれば、基本的にはLinux環境になると思います。ということで、その環境に合わせたファイルを取得し、配置してあげる必要があります。
その際、前述したsetPathも書き換えてください。Linux環境用のファイルは、phantomjs.exeではなく、phantomjsになります。もちろん、アップロードしたphantomjsのパーミッションを変更して実行権限を与えることも忘れずに。
今度こそ、適当なサイトのHTML情報がごそっと取れ…ました。どうやら上手く行ったようです。
PHP PhantomJSが上手く動かなかった際に確認すべきポイント
ポイントは3点
・setPathで実行ファイルをちゃんと指定してあげること
・実行ファイルのパーミッションを変更し、プログラムから実行可能にしてあげること
・サーバの環境に合わせた実行ファイルを配置すること
以上になります。
上手く動かせずに挫折してしまった人は参考にしてください。