CasperJSをphpからexecで叩く際のトラブル対応方法色々

2018-08-31 2018-09-06

CasperJSを使って色々ごにょごにょしていた中で、割とはまったのがphpからのexecによる実行です。
WebAPI化し、URLを叩くことで実行できる形にしたかったのですが、コマンドを直接叩くのに比べて、かなり色々な障害が発生しました。

その際、色々検索もしてみたわけですが、求めている情報があまり出てこず、「これは困ってる人結構いるだろうな」と思ったので、その際のトラブル対応法をまとめておきます。

CasperJSを実行した結果、何のエラーが発生してるかそもそもわからない

これは、ちゃんと動いているかどうか以前の問題で、どういう状況かそもそもわかっていないというケースです。この場合は、execコマンドのエラー出力を見ることからスタートすることをおすすめします。

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ポリシーは適用させるが、アクセス拒否はしない)モードに変更します。

で、現在何に設定されているかが表示される(enforcing, permissive, disableのどれか)ので、enforcingだったら(disableが返って来てる場合は、今回の問題要因ではない)permissiveに変更します。

これでSELinuxがPermissiveモードに変更されました。

CasperJSが行方不明

このケースはあまりないと思いますが、execの引数を絶対パスで指定することで解決される可能性があります。

PhantomJSが行方不明

「No such file or directory; did you install phantomjs?」が返ってきてしまうというやつです。

これは、phpからだけでなく、casperjsを直接叩いたときに発生する場合もあります。その場合の対応方法は、PATHにphantomjsをちゃんと追加してやることになります。「phantomjs」と、パスをつけずに叩いて動く状態でないと駄目ということ。

また、phpからの実行時だけエラーが発生する場合は

putenvでPHANTOMJS_EXECUTABLEのパスを設定してやれば良いという情報も見かけました(私はこの状況になっていないので、参考まで)。

実行結果が文字化けする

phpのエンコードと、CasperJS実行側のエンコードを合わせてやれば解決します。

execの頭でエンコードを設定してから、コマンドを実行します。