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

我不太确定我是否真的了解您愿意得到什么,但是如果您希望显示“已完成”消息:

  • 只有一次
  • 只有当两个进程都完成了它们的工作时

你应该 :

  • 在父进程中使用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";
}

有了这个,每个进程都将完成它的工作,只有当两者都完成时,父进程才会显示一切都已完成:

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


作为旁注:您正在使用两个独立的进程;一旦分叉,您就不能“轻松”在它们之间共享数据——因此将数据从孩子传递给父亲并不容易,反之亦然。

如果你需要这样做,你可以看看共享内存函数——或者只使用普通文件^^


希望这会有所帮助——并且我正确理解了这个问题^^

于 2009-09-10T20:41:12.973 回答
0

来自过程控制扩展介绍

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

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

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

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

于 2010-07-16T13:42:20.343 回答