人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

よろしくお願いします。

●質問者: lg-tsp
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:PHP バックエンド プログラム 根本 目的
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● kn1967
●23ポイント

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

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

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

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

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

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

◎質問者からの返答

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

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

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

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

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

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

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

echo $pid;

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

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

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


2 ● garyo
●23ポイント

PHPで並行処理

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

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

◎質問者からの返答

ありがとうございます。

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

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

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


3 ● openseed
●22ポイント

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

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

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

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

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

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

◎質問者からの返答

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

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

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


4 ● openseed
●22ポイント

以下で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); とする必要があるかもしれません。



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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ