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