プログラムの分岐処理(応答は正常終了しているが、裏側で別のプログラムが処理している。)に関する質問です。


正直、根本的にどう実現するかよくわかっておりません。
正常終了したということは、全てのプログラム(関数)が正しく終わったということになると思うのですが・・・
そして、そのバックエンドで別の処理を走らせたいのが目的です。

自分はPHPを使っているのですが、どのような実現方法があるのでしょうか?

よろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:2007/02/03 04:56:36
  • 終了:2007/02/10 05:00:04

回答(4件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/02/03 05:50:11

ポイント23pt

>正常終了したということは、全てのプログラム(関数)が正しく終わった

http://jp.php.net/manual/ja/function.exec.php

exec 外部プログラムを実行する

system 外部プログラムを実行し、出力を表示する

passthru 外部プログラムを実行し、未整形の出力を表示する

といったもので外部プログラムを起動すれば別プロセスとして動作してくれますので本体のPHPプログラムとは関係無くバックで動きますが、こういった情報が欲しいのではないって事であれば、目的をもう少し詳しく書いてみてください。

id:lg-tsp

ご回答ありがとうございます。

教えて頂いたページも元にテストをやってみましたが、希望に近い動きが出来そうでした。

「exec関数で外部関数を呼んで、出力を捨てる。」

(ログファイルは別途作って記録する必要はあるのでしょうが…)

という形↓でいけそうでした。

--------------------------------------------

$pid=exec("/usr/local/bin/php run.php > /dev/null & echo \$!");

echo $pid;

--------------------------------------------

ただ、exec関数で、利用者からの入力値を利用するのであれば、

かなりセキュリティに気を使ったほうが良さそうだな~っというのが感想です。

2007/02/06 00:28:05
id:garyo No.2

garyo回答回数1782ベストアンサー獲得回数962007/02/03 19:23:55

ポイント23pt

PHPで並行処理

http://blog.xole.net/article.php?id=541

こちらでどうでしょうか?

id:lg-tsp

ありがとうございます。

「親プロセス-子プロセス」という形を取り、個別に処理を終了させるわけですか。。

私の頭だとまだ理解に乏しくて…

とはいえ、コードが実際に記述してあるので一通り検討してみます。ありがとうございました。

2007/02/06 00:37:08
id:openseed No.3

openseed回答回数51ベストアンサー獲得回数62007/02/04 21:58:29

ポイント22pt

質問の内容を取り間違えていたらごめんなさい。

(応答は正常終了しているが、裏側で別のプログラムが処理している。)

が、クライアントのブラウザに正常にページを返した後、バックグラウンドで後処理を行いたいと言うことであれば、

http://www.php.net/manual/ja/features.connection-handling.php

http://www.php.net/manual/ja/function.ignore-user-abort.php

のリファレンスマニュアルが、参考になるかもしれません。

id:lg-tsp

ご回答ありがとうございます。こういう設定も細かく制御できるんですねぇ。

でもこれですと、利用者に正常終了画面を一旦出すという目的はどのように実現するのでしょうか?

どちらかというと、利用者のアクションから重たい処理を最後まで必ず終了しなくてはならない時とかに利用するような場合ですかねぇ?

2007/02/06 00:32:25
id:openseed No.4

openseed回答回数51ベストアンサー獲得回数62007/02/06 04:49:15

ポイント22pt

以下で2つのサンプルがあります。

http://www.php.net/manual/ja/features.connection-handling.php#71...

利用者に正常終了画面を一旦出すという目的はどのように実現するのでしょうか?

Content-Lengthの設定 と flush() を実行することで、クライアントに返却されます。

URLの画面の下の example: で、

// Do processing here

のところは、ブラウザに返却した後、実行されます。

※ この場合、flush 以降は、echo で画面出力しても、クライアント側には、表示されません。

※ ちなみに、URL画面の上部サンプルもそれとなく動きますが、おそらく、ブラウザの停止ボタンを押すと破棄される(と思います。)

実際に、テストコードを書いていないので、なんともいえませんが、example: のignore_user_abort は、ignore_user_abort(true); とする必要があるかもしれません。



上記で、目的は達成できるでしょうか。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません