Webページのキャプチャーを自動化するためにPHP PhantomJSを導入しようとしたのですが、以下のようなエラーが出てしまい動作しませんでした。。。
ということでこれが動作するまでの備忘録です
Message: Error when executing PhantomJs procedure - File does not exist or is not executable: bin/phantomjs
実行環境
まず実行環境は以下の通り
OSはWindows10
PHP5.6をxamppでインストール
PHP PhantomJSはcomposerからインストール
comporserはexeファイルからインストールしてあります。
※ふたりはララベルさんのブログに記載されているような手動でのインストール方法もありますが、
どちらの方法でも今回は(PHP PhantomJSが無事インストールできれば)どちらでもいい
またPHP PhantomJSをインストールする際に使用したcomposer.jsonの内容は以下の通り
{ "require": { "jonnyw/php-phantomjs": "3.*" }, "config": { "bin-dir": "bin" }, "scripts": { "post-install-cmd": [ "PhantomInstaller\\Installer::installPhantomJS" ], "post-update-cmd": [ "PhantomInstaller\\Installer::installPhantomJS" ] } }
(↑のエラーが発生した)実行したソース
動作確認のテスト用として自分のHPのデータを取得するソースを記述しました。
それが以下のコード
$client = Client::getInstance(); $request = $client->getMessageFactory()->createRequest(); $response = $client->getMessageFactory()->createResponse(); $request->setMethod('GET'); $request->setUrl('http://unvent.jp'); $client->send($request, $response); var_dump($response);
実行すると『Message: Error when executing PhantomJs~』とエラーを吐いてくる。
色々と調べてみるとsetBinDir()やらsetPhantomJs()の関数でパスを設定している!
なるほど!?ではその2行を設定してみよう↓
$client = Client::getInstance(); $client->setBinDir('./bin/'); $client->setPhantomJs('phantomjs.exe'); ~以下同じ~
そして実行結果が以下
Fatal error: Call to undefined method JonnyW\PhantomJs\Client::setBinDir()
はい、引数のパスが間違っているとかではなく、そもそも関数が見当たらないって言われています・・・。
で、再度探し回って動いたのがこれ↓
$client = Client::getInstance(); $client->getEngine()->setPath('C:/xampp/htdocs/php/sps/bin/phantomjs.exe'); $request = $client->getMessageFactory()->createRequest(); $response = $client->getMessageFactory()->createResponse(); $request->setMethod('GET'); $request->setUrl('http://unvent.jp'); $client->send($request, $response); var_dump($response);
setPath()の関数でexeのパスを指定することで無事解決。
この情報見つけるのに時間かかった・・・Windosユーザ少ないのかなぁ。
OS依存最低!