- 締切済み
◆バックエンド処理の終了を知りたい。
いつもお世話になっております。 ある処理で重たい部分をバックエンド側に送っています。(/path/index.php) $cmd = '/usr/local/bin/php /path/test.php '. $q_str1 .' '. $q_str2 .' > /dev/null &'; exec($cmd); test.php内で処理が完了した場合に元の画面へ知らせる方法などあるのでしょうか? 今はしょうがないので、(/path/index.php)の完了画面に「ボタン」を設け、何分か経過後任意に押下すれば、 (/path/to/test.php)の結果を取得するというアナログ(?)な方法をとっています。 以下はtest.phpの処理後に書いた1行です。馬鹿げたもので勿論動作しませんが、希望はこんな感じです(汗)。。。 header( "Location: "."http://". $SERVER_NAME ."/path/index.php?id=FromBack" ); exit; バックエンドでの処理終了後、結果を表示させたい。 PHPだけで可能でしょうか? もう1つ。 バックエンド側に渡す時に引数も渡しているのですが、$argv内で4つまでしか配列が取れず、5つめ以降は以下のように4つめで結合して取得されます。 [argv] => Array ( [0] => /path/index.php [1] => q_str1 [2] => q_str2 [3] => q_st3q_str4q_str5 ) これはargvの制限なのでしょうか? 以上、宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- tany180sx
- ベストアンサー率63% (239/379)
JavaScriptで非同期に並列でやるとして簡単に考ると、 ------ download.php // 1URLをDLするページ search.php // DLしたものを検索 ------ 検索ボタンを押下。 1000回非同期にdownload.phpにリクエスト。 1000回レスポンスがたまればsearch.phpにリクエスト。 検索結果を表示。 ------ DLする時に以前と更新日が同じものは内容まではDLしないとか 何日以内にDLしていればDLしないとかすれば多少は速くなるでしょうけど、 目的が検索エンジンの類ならまぁ仕様はいまいちですね。
- altrn
- ベストアンサー率62% (10/16)
たとえば本体として、 <div id="display"></div> を用意し、読み込むファイルを <?php sleep(10); echo '完了'; ?> として用意するとします。ここで何か送信ボタンを押すと <div id="display">読み込み中</div> にかわり(ページのリロードはありません。画面の一部がリロードされる感じでしょうか。)、さらに十秒後に <div id="display">完了</div> が得られるような、そのようなことを可能にする仕組みです。 ただし、ある程度Javascriptの知識が必要になりますので、いろいろと時間がかかるかもしれません。 ですのでむしろ、この場合フレームをうまく工夫して使うと手軽でいいかもしれません。
- altrn
- ベストアンサー率62% (10/16)
execやsystemなどで > /dev/null をつけると、実行したあと即座に次の行に進むようですので、実行した向こう側で何が起こったかなどは一切わかりません。 $hoge=exec(....); などとすれば何か結果を得ることが可能ですが、こうすると実行した向こう側の処理が終わるのを待つので結局バックグラウンドでの処理ではなくなってしまいます。 「完了したことを元の画面へ知らせる」必要があるのであれば、 ajaxなどを試してみたほうがやりたいことができるのではないかと思いますが、どうでしょうか...
- yambejp
- ベストアンサー率51% (3827/7415)
前回のつづき? execでコマンド実行しても、非同期じゃないのでなんら高速化に つながらないのでは? 前回もかきましたが、cronなどの定期処理でwgetをあらかじめ 実行しておき、その結果をテキストで取っておけばよいのでは? 処理の終了時点で、最終更新日時をログにおとしておけば、 それを見て更新済みかどうか判断できるので。
補足
>前回のつづき? はい。。。 >execでコマンド実行しても、非同期じゃないのでなんら高速化に >つながらないのでは? 前回、バックエンドで実行する前は、file関数で1000行以上を処理する場合、2分以上かかり、httpのレスポンスがタイムアウトしてしましまいたが、同じ処理をバックエンドで実行すると問題なくスムーズに処理できました。 >cronなどの定期処理でwgetをあらかじめ実行しておき.. あらかじめには実行はしたくありません。 処理に多少時間がかかっても、「入力→検索実行→結果一覧取得」の流れはセットにしたいのです。 今回の質問は、検索実行が終了後『何らか』のタイミングで処理終了を取得し、自動で検索一覧が取得できないかと考えています。 質問でも書きましたが、完了画面の「ボタン」を押下すれば、一覧が取得完了した場合は取得できるプログラムは完成したのですが、もっとスマートなやり方が存在するのかと思いました。
補足
>ajaxなどを試してみたほうが... PHPをかじりたてでして、ajaxは名前しか。。。 どういった事が可能なのかイメージだけでも教えて頂けないでしょうか。