てぃーだブログ › とりあえずやってみる! › サーバー › シェルスクリプト › コマンドラインでの引数の渡し方

2013年02月13日

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

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

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

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


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

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

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

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

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

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





にほんブログ村 IT技術ブログへ
にほんブログ村



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

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



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






同じカテゴリー(サーバー)の記事
連続アクセスを防ぐ
連続アクセスを防ぐ(2013-01-22 21:24)

cronが無い
cronが無い(2013-01-10 17:57)


 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。