6

別の PHP Web ページ内から実行する必要がある PHP スクリプトがあります。ただし、2 番目が適切に実行されるためには、最初のものが完全に完了している必要があります。基本的に、開始する前に 1 秒待機する 2 番目のスクリプトの新しいプロセス/スレッドを生成するには、最初のページが必要です。

インクルードを実行するとブロックが発生し、それが機能しなくなり、exec を使用して開始できません

編集:

明確にするべきでした。これらのページには出力がなく、Web インターフェイスを介して接続されていません。すべてのページは、別のサーバーからの POST 要求によって呼び出されます。


編集2:

解決策: ページを要求しているサーバーが、最初のページが返されてから 1 秒後に 2 番目のページに直接要求を送信するようにします。

4

3 に答える 3

1

@ChristopherMorrisseyが指摘したように、proc_openは正しい選択です。proc_open を使用する際の注意点がいくつかあるため、ここで少し詳しく説明します。

最初のコード例 @ http://php.net/manual/en/function.proc-open.phpでは、全体的な使用法を示しており、それを参照します。

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

POSIX 準拠の OS では、プロセスが終了する前に、プロセスへの STDIN を閉じる必要があります。親からパイプで fclose を呼び出すことは非常に重要です。そうしないと、子プロセスがスタックします。これは、例の次の行で行われます。

fclose($pipes[0]);

もう 1 つの注意点は、子プロセスの終了コードをチェックすることです。終了コードをチェックすることは、子プロセスが正常に終了したか、エラーになったかを判断する最良の方法です。少なくとも、子プロセスがいつ完了したかを知る必要があります。これと終了コードの確認は両方ともhttp://www.php.net/manual/en/function.proc-get-status.phpで行われます

プロセスが正しく終了することを確認したい場合はexitcode、proc_get_status から配列に返されたフィールドを確認する必要があります。この終了コードは有効な値を 1 回だけ返すことに注意してください。それ以外の場合は -1 を返します。したがって、一度返される > -1 は、実際の終了コードです。というわけで、初回running==偽、チェックexitcode

これが役立つことを願っています。

于 2013-08-09T18:46:11.443 に答える
1

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

あなたはこのようにすることができます:

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

あるいは:

//first script here
//redirect after one sec 
echo "<meta http-equiv=\"refresh\" content=\"1;URL='http://thetudors.example.com/'\" />";
于 2013-08-09T17:53:12.310 に答える
0

必要に応じて 2 ページ目にヘッダーを書き、2 ページ目の最後でヘッダーを元のページに戻すことができる場合があります。PHP コードを HTML に含める必要があるなど、この修正が機能しない理由はたくさんあります。

ヘッダー参照 したがって、次のようになります。header(Location: seconddocument.php)

または、関数内で実行する PHP を配置して、元の PHP ドキュメントから呼び出すこともできます。ここであなたの要件を正確に把握することはできませんが、これらが私の 2 つの最良の回答です。

于 2013-08-09T17:48:15.897 に答える