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起動するようにすればいいのか・・・
んで、どうすればいいんだろ?
0 件のコメント:
コメントを投稿