嘿那里,我有一个简单的脚本,假设同时加载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>";
?>
任何帮助将不胜感激!
答案 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找到有关如何使用的示例。