2013年02月13日
コマンドラインでの引数の渡し方
こんばんは フクタケです。
今回、PHPでexec関数を使いバックグラウンドでコマンドラインを使い
処理を行う方法を試しました。
普通であればデータを処理する場合、URLにGETデータを持たせたり、
ソース上にPOSTデータを持たせて処理するのですが、今回はブラウザから
hoge-A.phpにアクセスした際、exec関数を使ってコマンドから
hoge-B.phpに引数を渡して裏側で実行させる、という事をしました。
何がしたかったかというと、hoge-A.phpはデータを受けるだけ受けて
hoge-B.phpに丸投げした後、すぐに次のデータ待ち状態にしたい!と考えました。
にほんブログ村
今回、PHPでexec関数を使いバックグラウンドでコマンドラインを使い
処理を行う方法を試しました。
普通であればデータを処理する場合、URLにGETデータを持たせたり、
ソース上にPOSTデータを持たせて処理するのですが、今回はブラウザから
hoge-A.phpにアクセスした際、exec関数を使ってコマンドから
hoge-B.phpに引数を渡して裏側で実行させる、という事をしました。
何がしたかったかというと、hoge-A.phpはデータを受けるだけ受けて
hoge-B.phpに丸投げした後、すぐに次のデータ待ち状態にしたい!と考えました。
にほんブログ村
[ 手順 ]
hoge-A.phpには任意の値を渡し、ソース内でexec関数でhoge-B.phpに受け取った値を
引数として渡します。
例えば、http://example.com/hoge-A.php?id=123&num=456 でアクセスした場合。
hoge-A.phpの内部でid, numを$_GETで受け取ります。
そのままexec関数を使ってhoge-B.phpにデータを渡します。
exec('/usr/bin/php ./hoge-B.php '.$_GET['id'].' '.$_GET['time'].' > /dev/null &');
※検証なのでMySQLインジェクション対策は無視してます。
因みにコマンドラインに書いてある「 > /dev/null &」は非同期で処理する事を意味します。
どういう事かというと、そのまま「 > /dev/null &」の記述なしでコマンドラインを走らせると
hoge-A.phpがレスポンスを返すのがhoge-B.phpの処理が完了した後になります。
これではhoge-B.phpの処理が重かった場合、hoge-A.phpがレスポンスの返しに時間が
掛かり、当初やりたかったhoge-A.phpが即座に次のデータ待ちの状態にはなりません。
コマンドラインの末尾に「 > /dev/null &」を書き加えることで非同期となり、hoge-A.phpは
hoge-B.phpに処理依頼だけをして即座にレスポンスを返し、次の動作に備える事が出来ます。
※基本PHPでは非同期処理をサポートしていないので、外部プログラムとして実行させます。
ためしにhoge-B.phpではMySQLに10万件書き込む処理を書いておき、execでコマンドを
走らせたところ、hoge-A.phpは0.002秒でレスポンスを返し、hoge-B.phpがバックグラウンドで
10万件書き込む処理を完了させました。
やりたかった事が出来たので後日、ウチの会社のシステムに組み込むことにします。
ただあまりに大量のデータを送ると結局、負荷になってしまうので注意は必要ですね。