CasperJSをphpからexecで叩く際のトラブル対応方法色々
2018-08-31 2018-09-06
CasperJSを使って色々ごにょごにょしていた中で、割とはまったのがphpからのexecによる実行です。
WebAPI化し、URLを叩くことで実行できる形にしたかったのですが、コマンドを直接叩くのに比べて、かなり色々な障害が発生しました。
その際、色々検索もしてみたわけですが、求めている情報があまり出てこず、「これは困ってる人結構いるだろうな」と思ったので、その際のトラブル対応法をまとめておきます。
CasperJSを実行した結果、何のエラーが発生してるかそもそもわからない
これは、ちゃんと動いているかどうか以前の問題で、どういう状況かそもそもわかっていないというケースです。この場合は、execコマンドのエラー出力を見ることからスタートすることをおすすめします。
1 2 3 4 5 |
<?php exec('cd /root 2>&1', $output, $status); var_dump($output); echo $status; ?> |
2>&1の意味は「標準エラー出力の結果を標準出力にリダイレクト」です。ということで、これを実行するとエラーが発生した際の出力が、標準出力である$outputに入ってくるようになります。これで、どんなエラーが発生しているのか、確認する準備が出来ました。
ちなみに、上のコードだと、「sh: line 0: cd: /root: Permission denied」が出力されると思います。「root権限無いから、そりゃそうだよね」みたいな感じで、エラー原因を理解して、対応方法を考えていくということです。
念のためステータスコードもechoで出力してますが、0以外が返ってきたらエラーです。1とか2とか127とか126とかのエラーコードは調べればすぐわかりますが、謎の数字が返ってくることもあるのでそれ程参考にはなりません。
CasperJSがPermission deniedで叩けない
「casperjs/bin/casperjs: Permission denied」みたいなやつです。
対応方法の候補は2つ。
casperjsのパーミッションを変更する
casperjsの実行権限自体が正しく与えられていないケースです。直接ファイルをダウンロードして配置した場合には、パーミッションの変更を忘れてしまうこともあるので注意しましょう。
755とかにしておけば安泰です。
SELinuxをPermissiveに変更する
CentOS7とかで多いのがこれです。SELinuxの説明については今回は省きますが、SELinuxが有効になっていると、ファイルのパーミッションやオーナーに関わらず、実行権限が無いと判断されてしまうことがあります。
しかし、無効にしてしまうと弊害が色々ある、ということで、今回はPermissive(SELinuxポリシーは適用させるが、アクセス拒否はしない)モードに変更します。
1 |
getenforce |
で、現在何に設定されているかが表示される(enforcing, permissive, disableのどれか)ので、enforcingだったら(disableが返って来てる場合は、今回の問題要因ではない)permissiveに変更します。
1 |
setenforce 0 |
これでSELinuxがPermissiveモードに変更されました。
CasperJSが行方不明
このケースはあまりないと思いますが、execの引数を絶対パスで指定することで解決される可能性があります。
1 2 3 4 |
<?php // exec('casperjs sample.js', $output, $status); exec('/usr/bin/casperjs /var/www/sample/sample.js', $output, $status); // 絶対パスで指定 ?> |
PhantomJSが行方不明
「No such file or directory; did you install phantomjs?」が返ってきてしまうというやつです。
これは、phpからだけでなく、casperjsを直接叩いたときに発生する場合もあります。その場合の対応方法は、PATHにphantomjsをちゃんと追加してやることになります。「phantomjs」と、パスをつけずに叩いて動く状態でないと駄目ということ。
また、phpからの実行時だけエラーが発生する場合は
1 2 3 |
<?php putenv('PHANTOMJS_EXECUTABLE=/usr/bin/phantomjs'); ?> |
putenvでPHANTOMJS_EXECUTABLEのパスを設定してやれば良いという情報も見かけました(私はこの状況になっていないので、参考まで)。
実行結果が文字化けする
phpのエンコードと、CasperJS実行側のエンコードを合わせてやれば解決します。
1 2 3 |
<?php exec('export LANG=ja_JP.UTF-8; /usr/bin/casperjs sample.js', $output, $status); ?> |
execの頭でエンコードを設定してから、コマンドを実行します。