我的问题是这样的。我正在分叉一个进程,以便加速磁盘上文件的访问时间。我将这些文件中的任何数据存储在本地桌面的临时文件中。理想情况下,在所有进程完成后,我需要访问该临时文件并将其数据放入数组中。然后,我取消链接临时文件,因为它不再需要了。我的问题是似乎pcntl_wait()在进行最后一组操作之前并不等待所有子进程都完成。所以我最终会在某个随机进程完成之前取消链接该文件。
我似乎找不到一个可靠的方法来等待所有进程干净地退出,然后访问我的数据。
请注意,我省略了很多与我实际所做的事情相关的代码,如果需要发布那些代码也没有问题。
我似乎找不到一个可靠的方法来等待所有进程干净地退出,然后访问我的数据。
$numChild = 0;
$maxChild = 20; // max number of forked processes.
// get a list of "availableCabs"
foreach ($availableCabs as $cab) {
// fork the process
$pids[$numChild] = pcntl_fork();
if (!$pids[$numChild]) {
// do some work
exit(0);
} else {
$numChild++;
if ($numChild == $maxChild) {
pcntl_wait($status);
$numChild--;
}
} // end fork
}
// Below is where things fall apart. I need to be able to print the complete serialized data. but several child processes don't actually exit before i unlink the file.
$dataFile = fopen($pid, 'r');
while(($values = fgetcsv($dataFile,',')) !== FALSE) {
$fvalues[] = $values;
}
print serialize($fvalues);
fclose($dataFile);
unlink($file);
请注意,我省略了很多与我实际所做的事情相关的代码,如果需要发布那些代码也没有问题。
$pids[$numChild]
中的每个 pid,并在每个 pid 上使用 http://php.net/pcntl_waitpid(与 pcntl_wait 不同)进行处理。 - Frank Farmerforeach()
循环之外测试它吗? - au_stan