[jq + php] –slurpfileを使った時に戻り値が取得できない不具合

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

jqコマンドをphpから呼び出して、整形された検索結果を即座に呼び込むと非常に扱いやすいWEBシステムが構築できます。
 

もはや、SQLのテーブルからカラムを設計・設定して、型仕様を作って、リレーショナルを構築する工程が、かなりの短時間に実装できてしまう手軽さと、システムフォルダをコピーするだけで、データの環境構築が簡単にできてしまうこうしたフレームワークを自分で作っておけば、大体どんなシステムにおいても、かなりの高速開発が可能になるのですが、
 

jqコマンドは、そうしたjsonデータの格納と、データ呼び出し(検索)の非常に強力なアイテムであることは言うまでもありません。
 

APIシステムなどを作る時には、読み込みも書き出しも、もはや必須かもしれませんね。
 

そんなjqコマンドをphpで使う時に、不具合とも考えられる症状を見つけたのでシェアしておきます。

不具合内容

以前に書いた記事で、jqコマンドで複数のjsonファイルを読み込むやり方で、ファイルを整形して読み込むtipsを紹介しましたが、
 

[jq] 複数のjsonデータを変数に格納して便利に使う方法
 

紹介したコマンドをそのままphpで読み込みをすると、返り値が一切なくなってしまいます。
 

順を追って不具合を見てみましょう。
 

 

 

これは問題ないやり方です。
シンプルすぎてあまり参考にならないかもしれませんが、要するにjqコマンドは普通に使えるという事がわかります。
 

続いて”–slurpfile”オプションを使ってみます。
 

 

これも正常に取得可能です。
 

さらに、jsonデータ取得をjqコマンドを用いてフィルタリングしてみましょう。
 

 

なんとここでエラーが返ってきます。
ブラウザ越しに見ると、何にも表示されないのですが、CLIコマンドでPHPを実行すると、エラー文言を見ることができます。
 

どうやら()カッコが気に入らないらしくsyntaxエラーになっていますが、エスケープしても、”sh: 1: cannot open (jq: No such file”というエラーになるだけで全く解決できません。

解決方法!?

色々調べてみたところ、どうやらこれは、phpのexecが/bin/shを使ってコマンド実行しており、jqコマンドの上位命令は、bashを使わないといけないという事が判明しました。
 

試しに、上記のjqコマンド部分を.shファイルに書き出して、phpで、shell_exec(“bash slurp.sh”)と実行すると問題なく表示できるようになりました。
 

う〜〜〜ん、phpをデフォルトでbash起動するようにすればいいのか・・・
 

んで、どうすればいいんだろ?
 

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です