PHP popen 管道在一次迭代后变为空


PHP popen pipes becoming null after one iteration

我正在尝试生成 12 个工作进程,以便在 Windows 下使用 PHP 中的 popen 来处理我的各种数据块。这是我的代码...这是非常通用的。

<?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 的限制,然后结束。它永远不会等他们真正完成。

我尝试在popenecho $worker的值,并返回"资源实例 ID #XXX",这告诉我工作正常。

我还尝试echo"here!"作为代码的else部分,如果工作线程未设置为 null,则应执行该部分...该代码永远不会执行,即使它应该执行。

怎么了?我是瞎子吗?

foreach

数组的副本进行操作。 您需要使用 & 引用$worker来修改原始数组的元素:

foreach($workers as &$worker) {

另一种选择是:

foreach($workers as $key => $worker) {
    $workers[$key] = 'something';
}