PHP popen 管道在一次迭代后变为空
PHP popen pipes becoming null after one iteration
我正在尝试使用 Windows 下的 PHP 中的 popen
生成 12 个工作进程来处理我的各种数据块。这是我的代码...它非常通用。
<?php
set_time_limit(0);
$workers = array_fill(0, 12, null);
$currChunk = 56;
$working = true;
while($working == true) {
$working = false;
foreach($workers as $worker) {
if($worker == null) {
if($currChunk < 265) {
$worker = popen('C:\php\php.exe "C:\users\administrator\desktop\do one chunk.php" '.$currChunk, 'r');
echo("\r\nStarted a worker on chunk ".$currChunk);
$currChunk ++;
$working = true;
}
} else {
if(feof($worker)){
pclose($worker);
$worker = null;
echo("A worker finished!");
} else {
fread($worker, 1);
$working = true;
}
}
}
sleep(.01);
}
?>
这里发生的事情是脚本不断启动新的工作程序,直到达到 265 的限制,然后结束。它从不等待他们真正完成。
我已经尝试 echo
在 popen
之后输入 $worker
的值,然后我返回 "Resource Instance ID #XXX",这告诉我工作正常。
我还尝试 echo
ing "here!" 代码的 else
部分,如果 worker 未设置为 null,则应执行该代码...该代码永远不会执行,尽管它应该。
怎么了?我瞎了吗?
foreach
对数组的副本进行操作。需要引用$worker
using &
修改原数组的元素:
foreach($workers as &$worker) {
备选方案是:
foreach($workers as $key => $worker) {
$workers[$key] = 'something';
}
我正在尝试使用 Windows 下的 PHP 中的 popen
生成 12 个工作进程来处理我的各种数据块。这是我的代码...它非常通用。
<?php
set_time_limit(0);
$workers = array_fill(0, 12, null);
$currChunk = 56;
$working = true;
while($working == true) {
$working = false;
foreach($workers as $worker) {
if($worker == null) {
if($currChunk < 265) {
$worker = popen('C:\php\php.exe "C:\users\administrator\desktop\do one chunk.php" '.$currChunk, 'r');
echo("\r\nStarted a worker on chunk ".$currChunk);
$currChunk ++;
$working = true;
}
} else {
if(feof($worker)){
pclose($worker);
$worker = null;
echo("A worker finished!");
} else {
fread($worker, 1);
$working = true;
}
}
}
sleep(.01);
}
?>
这里发生的事情是脚本不断启动新的工作程序,直到达到 265 的限制,然后结束。它从不等待他们真正完成。
我已经尝试 echo
在 popen
之后输入 $worker
的值,然后我返回 "Resource Instance ID #XXX",这告诉我工作正常。
我还尝试 echo
ing "here!" 代码的 else
部分,如果 worker 未设置为 null,则应执行该代码...该代码永远不会执行,尽管它应该。
怎么了?我瞎了吗?
foreach
对数组的副本进行操作。需要引用$worker
using &
修改原数组的元素:
foreach($workers as &$worker) {
备选方案是:
foreach($workers as $key => $worker) {
$workers[$key] = 'something';
}