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

时间:2015-01-22 19:03:13

标签: php popen

我正在尝试使用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之后尝试$worker popen的值,然后我找回“资源实例ID #XXX”,它告诉我工作正常。

我也试过echo“在这里!”对于else部分代码,如果worker未设置为null则应该执行...代码永远不会执行,即使它应该执行。

怎么了?我瞎了吗?

1 个答案:

答案 0 :(得分:2)

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

foreach($workers as &$worker) {

替代方案是:

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