コマンドラインでの引数の渡し方

フクタケ

2013年02月13日 20:38

こんばんは フクタケです。

今回、PHPでexec関数を使いバックグラウンドでコマンドラインを使い

処理を行う方法を試しました。


普通であればデータを処理する場合、URLにGETデータを持たせたり、

ソース上にPOSTデータを持たせて処理するのですが、今回はブラウザから

hoge-A.phpにアクセスした際、exec関数を使ってコマンドから

hoge-B.phpに引数を渡して裏側で実行させる、という事をしました。

何がしたかったかというと、hoge-A.phpはデータを受けるだけ受けて

hoge-B.phpに丸投げした後、すぐに次のデータ待ち状態にしたい!と考えました。


var kauli_yad_count = typeof(kauli_yad_count) == 'undefined' ? 1 : kauli_yad_count + 1;(function(d){ d.write(''); var s = d.createElement('script'); var h = d.getElementsByTagName('head')[0]; s.defer = 'defer'; s.async = 'async'; s.src = 'http://js.kau.li/yad.js'; h.insertBefore(s, h.firstChild);})(document);



にほんブログ村


[ 手順 ]
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万件書き込む処理を完了させました。

やりたかった事が出来たので後日、ウチの会社のシステムに組み込むことにします。



ただあまりに大量のデータを送ると結局、負荷になってしまうので注意は必要ですね。





関連記事