PHP分叉随机做父母或子进程取决于完成什么首先我做错了什么?

时间:2009-09-10 20:13:44

标签: php fork

嘿那里,我有一个简单的脚本,假设同时加载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>";

?> 

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我不太确定我真的明白你愿意得到什么,但如果你想要显示你的“完成”信息:

  • 只有一次
  • 只有在两个流程完成工作时

你应该:

  • 在父进程中使用pcntl_wait,等待其子进程
  • 在等待完成后,从父进程回收“完成”。

例如,类似这样的事情应该:

$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";
}

有了这个,每个进程都会完成它的工作,只有当两个进程完成时,父进程才会显示所有内容都已完成:

  • 如果父母先完成,则会等待孩子
  • 如果孩子先结束,父母将不会等待......但仍然在完成之后完成。


作为旁注:您使用两个独立的流程;一旦分叉,你就不能“轻松地”在它们之间共享数据 - 因此将数据从孩子传递给父亲并不容易,也不是另一种方式。

如果您需要这样做,可以查看Shared Memory Functions - 或者只使用普通文件^^


希望这有帮助 - 我正确地理解了这个问题^^

答案 1 :(得分:0)

来自Process Control Extension Introduction

  PHP中的过程控制支持实现了过程创建,程序执行,信号处理和过程终止的Unix风格。 不应在Web服务器环境中启用过程控制,并且如果在Web服务器环境中使用任何过程控制功能,则可能会出现意外结果。

基本上,当你通过apache模块运行PHP脚本时,不应该使用任何pcntl函数。

如果您只想同时从这两个页面中获取数据,那么您应该可以使用stream_select来实现此目的。您可以在http://www.ibm.com/developerworks/web/library/os-php-multitask/找到一个示例。

BTW显然curl也支持这一点,使用curl_multi_select,可以在http://www.somacon.com/p537.php找到有关如何使用的示例。