0

こんにちは、2 つの別々のページを同時にロードし、それらからテキストを取得することを想定している単純なスクリプトがありますが、最初に終了したプロセスに応じて、親プロセスまたは子プロセスのいずれかをロードします。何が間違っていますか? ? 2 つのプロセスを同時に動作させたいのですが、サンプル コードは次のとおりです。

<?php

$pid = pcntl_fork();

if ($pid == -1) {
    die("could not fork");
}
else if($pid) {

                $url = "http://www.englishpage.com/verbpage/simplepresent.html";
                $readurl = file_get_contents($url);
                $pattern = '#Examples(.*?)Forms#s';
                preg_match($pattern, $readurl, $match);
                echo "Test1:".$match[1];


}
else {
                $url = "http://www.englishpage.com/verbpage/simplepresent.html";
                $readurl = file_get_contents($url);
                $pattern = '#Examples(.*?)Forms#s';
                preg_match($pattern, $readurl, $match);
                echo "Test2:".$match[1];

}

echo "<br>Finished<br>";

?> 

どんな助けでも大歓迎です!

4

2 に答える 2

0

プロセス制御拡張機能の概要から

PHPでのプロセス制御サポートは、Unixスタイルのプロセス作成、プログラム実行、シグナル処理、およびプロセス終了を実装します。Webサーバー環境内でプロセス制御を有効にしないでください。Webサーバー環境内でプロセス制御機能を使用すると、予期しない結果が生じる可能性があります。

したがって、基本的に、apacheモジュールを介してPHPスクリプトを実行している場合は、pcntl関数を使用しないでください。

これらの2つのページから同時にデータをフェッチするだけの場合は、stream_selectを使用してこれを実現できるはずです。例はhttp://www.ibm.com/developerworks/web/library/os-php-multitask/にあります。

ところで、どうやらcurlはcurl_multi_selectを使用してこれもサポートしているようです。これは、 http://www.somacon.com/p537.phpにある使用方法の例です。

于 2010-07-16T13:42:20.343 に答える
0

あなたが何を望んでいるのか、私が本当に理解しているかどうかはよくわかりませんが、「完了」メッセージを表示したい場合:

  • 1回だけ
  • 2 つのプロセスが作業を完了したときのみ

あなたがすべき :

  • 親プロセスで使用するpcntl_waitため、子が死ぬのを待ちます
  • 待機が終了した後、親プロセスから "finished" をエコーし​​ます。

たとえば、次のようなことを行う必要があります。

$pid = pcntl_fork();
if ($pid == -1) {
    die("could not fork");
}
else if($pid) { // Father
    sleep(mt_rand(0, 5));
    echo "Father done\n";

    pcntl_wait($status); // Wait for the children to finish / die

    echo "All Finished\n\n";
}
else { // Child
    sleep(mt_rand(0, 5));
    echo "Child done\n";
}

これにより、各プロセスはその作業を行い、両方が終了した場合にのみ、親はすべてが完了したことを表示します:

  • 親が最初に完了すると、子を待ちます
  • 子が最初に終了した場合、親は待機しません...しかし、それでもその後に終了します。


補足として: あなたは 2 つの別々のプロセスを使用しています。一度分岐すると、それらの間でデータを「簡単に」共有することはできません。そのため、子供から父親にデータを渡すことは簡単ではなく、その逆もありません。

それを行う必要がある場合は、Shared Memory Functionsを参照するか、単純なファイルを使用してください ^^


これが役に立てば幸いです-そして、私は質問を正しく理解しました^^

于 2009-09-10T20:41:12.973 に答える