2013-08-09 10 views
5

私は別のPHP Webページから実行する必要のあるPHPスクリプトを持っています。しかし、第2のものが正しく動作するためには、第1のものが完全に完了している必要があります。基本的には、開始する前に1秒待つ2番目のスクリプト用の新しいプロセス/スレッドを生成する最初のページが必要です。別のスクリプトの内部からPHPスクリプトを起動する。非ブロック化

が明らかになっている必要があります作業からそれを防ぐの原因ブロッキングを含めると、私はそれが幹部に

Editを使用して起動することができません行う

。これらのページは出力されず、Webインターフェイスを介してインターフェイスされません。すべてのページは、別のサーバーからのPOST要求によって呼び出されます。


編集2:

策:ページを要求し、サーバが最初に戻った後、2ページ目1秒に直接リクエストを送信します。

+0

proc_open? http://php.net/manual/en/function.proc-open.php – cmorrissey

+3

最も一般的な回答をここでチェックしてください:http://stackoverflow.com/questions/3819398/php-exec-command-or-similar-結果を待たずに –

+0

@brianこれはプラットフォームに依存しないPHPです。ですから、bashや/ devを使うのはオプションではありません。 – Sam

答えて

1

は、proc_openは、正しい選択です。 proc_openの使用にはいくつかの注意点がありますが、完全にはっきりしていないので、ここで少し詳しく説明します。

最初のコード例の@http://php.net/manual/en/function.proc-open.phpでは、全体的な使用状況を示しています。

最初の警告にはパイプが付いています。パイプはPHPのファイルストリームで、子プロセスのSTDIN、STDOUT、STDERRにリンクしています。この例では、パイプインデックス0は、親PHPプロセスの観点からのファイルストリームを表します。親プロセスがこのストリームに書き込むと、子プロセスへのSTDIN入力として表示されます。

POSIX準拠のOSでは、プロセスへのSTDINを終了してからプロセスを終了する必要があります。親からのパイプ上でfcloseを呼び出すことは非常に重要です。または子プロセスが止まってしまいます。これは例のこの行で行われます。

fclose($pipes[0]); 

その他の警告では、子プロセスの終了コードがチェックされています。子プロセスが正しく終了したかどうか、または間違っているかどうかを判断する最も良い方法は、終了コードを確認することです。少なくとも、子プロセスがいつ完了したかを知る必要があります。これと終了コードの確認はどちらもhttp://www.php.net/manual/en/function.proc-get-status.php

プロセスが正しく終了するようにするには、配列に返されたexitcodeフィールドをproc_get_statusから調べる必要があります。この終了コードは有効な値を1回だけ返します。それ以外の時間は-1を返します。つまり、-1を返すと、これは実際の終了コードです。したがって、初回はrunning == false、exitcodeをチェックしてください。

こちらがお役に立てば幸いです。

+0

質問に記載されているように、いずれのページにもIOが含まれていません。最初のページが完全に完了し、HTTP応答が送信されるまで、2番目のページは正常に実行されません。 – Sam

+0

IOを持たなくても@samの場合、STDINパイプを子プロセスに閉じる必要があります。親から子へ、またはその逆にIOが送られないことをプログラマが知っているとしても、OSはそれを知りません。 OSは、STDINがクローズされるまで子プロセスを終了させません。現時点では、親プロセス内のパイプを明示的に閉じることなく、親プロセスが終了するとPHPは自動的にパイプ上でcloseを呼び出します。これは、子プロセスが最終的に完了まで実行される時点です。 –

+0

これは概念実証システムのために行われており、実際に試してみるのは時間がかかりません。実稼働環境でPHPを使用していない可能性もあります。 – Sam

0

2番目のページに移動するヘッダーを書き出し、2番目のページの最後に元のページにヘッダーを戻すことができます。 PHPコードがHTMLに含まれる必要があるなど、この修正がうまくいかない理由はたくさんあります。だから、

Headers reference のようなもの:header(Location: seconddocument.php)

それともあなたが関数内で実行するためにPHPを入れて、元のPHPのドキュメントからそれを呼び出すことができます。私はここであなたの要件を正確に確信することはできませんが、それらは私の2つの最高の答えになるでしょう。

1

1つのオプションは、最初のスクリプトの終了後にページをリダイレクトすることです。

//first script here 
sleep(1); //wait one second 
echo "<meta http-equiv=\"refresh\" content=\"0;URL='yoursecondscript.php'\" />"; //redirect 

かさえ:あなたはそれをこのように行うことができます

@ChristopherMorrisseyが指摘したように

//first script here 
//redirect after one sec 
echo "<meta http-equiv=\"refresh\" content=\"1;URL='http://thetudors.example.com/'\" />"; 
+0

スクリプト1にいくつかの変数があったとしますが、リダイレクト後にスクリプト2で動作しますか? –

+0

最初のページを要求しているサーバーは、HTTP:200が存在することを確認する以外に応答を解析しないため、これは機能しません。 – Sam

+0

@YouKnowNothingJonSnowいいえ、まずセッションを開始してから、次のページからセッション変数を呼び出します。 – pattyd

関連する問題