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

2019年4月16日

jq テクノロジー プログラミング

jqコマンドをphpから呼び出して、整形された検索結果を即座に呼び込むと非常に扱いやすいWEBシステムが構築できます。 もはや、SQLのテーブルからカラムを設計・設定して、型仕様を作って、リレーショナルを構築する工程が、かなりの短時間に実装できてしまう手軽さと、システムフォルダをコピーするだけで、データの環境構築が簡単にできてしまうこうしたフレームワークを自分で作っておけば、大体どんなシステムにおいても、かなりの高速開発が可能になるのですが、 jqコマンドは、そうしたjsonデータの格納と、データ呼び出し(検索)の非常に強力なアイテムであることは言うまでもありません。 APIシステムなどを作る時には、読み込みも書き出しも、もはや必須かもしれませんね。 そんなjqコマンドをphpで使う時に、不具合とも考えられる症状を見つけたのでシェアしておきます。

不具合内容

以前に書いた記事で、jqコマンドで複数のjsonファイルを読み込むやり方で、ファイルを整形して読み込むtipsを紹介しましたが、 [jq] 複数のjsonデータを変数に格納して便利に使う方法 紹介したコマンドをそのままphpで読み込みをすると、返り値が一切なくなってしまいます。 順を追って不具合を見てみましょう。 {"id":"1","name1":"aaa"} {"id":"2","name1":"bbb"} {"id":"3","name1":"ccc"} {"id":"4","name1":"ddd"} {"id":"5","name1":"eee"}   <?php $res = shell_exec("jq '.' a.json"); echo $res; # Responce { "id": "1", "name1": "aaa" } { "id": "2", "name1": "bbb" } { "id": "3", "name1": "ccc" } { "id": "4", "name1": "ddd" } { "id": "5", "name1": "eee" } これは問題ないやり方です。 シンプルすぎてあまり参考にならないかもしれませんが、要するにjqコマンドは普通に使えるという事がわかります。 続いて"--slurpfile"オプションを使ってみます。 <?php echo shell_exec("jq -n --slurpfile a a.json '\$a' "); echo PHP_EOL; # Responce [ { "id": "1", "name1": "aaa" }, { "id": "2", "name1": "bbb" }, { "id": "3", "name1": "ccc" }, { "id": "4", "name1": "ddd" }, { "id": "5", "name1": "eee" } ] これも正常に取得可能です。 さらに、jsonデータ取得をjqコマンドを用いてフィルタリングしてみましょう。 <?php echo shell_exec("jq -n --slurpfile a <(jq 'select(.id==\"1\")' a.json) '\$a' "); # Responce sh: 1: Syntax error: "(" unexpected なんとここでエラーが返ってきます。 ブラウザ越しに見ると、何にも表示されないのですが、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起動するようにすればいいのか・・・ んで、どうすればいいんだろ?

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。