PHP pthreads,在池任务中,ob_flush和flush导致崩溃

时间:2015-05-26 05:46:43

标签: php apache pthreads threadpool flush

    $p = new Pool(10);

    for ($i = 0; i<1000; i++){
        $tasks[i] = new workerThread($i);
    }

    foreach ($tasks as $task) {
        $p->submit($task);
    }

    // shutdown will wait for current queue to be completed
    $p->shutdown();
    // garbage collection check / read results
    $p->collect(function($checkingTask){
        return ($checkingTask->isGarbage);
    });


class workerThread extends Collectable {

    public function __construct($i){
        $this->i= $i;
    }

    public function run(){
        echo $this->i;
        ob_flush();
        flush();
    }
}

上面的代码是一个会导致崩溃的简单示例。我试图通过放置ob_flush();和flush()来实时更新页面;在Threaded Object中,它大部分都按预期工作。所以上面的代码不能保证每次都崩溃,但是如果再运行几次,有时脚本会停止,Apache会重新启动,并显示错误消息“httpd.exe应用程序错误”0x006fb17f处的指令“引用内存”0x028a1e20 “。内存不能”写入“。单击”确定“。”

我认为这是因为多个线程试图在同一时间刷新时冲洗多个线程的冲突?我可以做些什么来解决它并刷新,因为有任何新的输出。

1 个答案:

答案 0 :(得分:2)

多个线程不应该写标准输出,没有安全的方法来执行此操作。

Zend没有提供使其安全的工具,它巧合,并且总是不安全。