PHP pthreads,在池任务中,ob_flush 和刷新导致崩溃
PHP pthreads, in pool tasks, ob_flush and flush cause crash
$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(); 来实时更新页面。在线程对象中,它主要按预期工作。所以上面的代码不能保证每次都会崩溃,但是如果你 运行 它多次,有时脚本会停止并且 Apache 重新启动并显示一条错误消息 "httpd.exe Application error The instruction at "0x006fb17f" referenced memory at "0x028a1e20" .内存不能"Written".点击确定.
我认为是多个线程在大约同一时间尝试刷新时发生刷新冲突造成的?我可以做些什么来解决它并刷新,因为有任何新的输出。
多线程不应该写标准输出,没有安全的方法来做到这一点。
Zend 没有提供使其安全的工具,它的工作是巧合的,并且永远是不安全的。
$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(); 来实时更新页面。在线程对象中,它主要按预期工作。所以上面的代码不能保证每次都会崩溃,但是如果你 运行 它多次,有时脚本会停止并且 Apache 重新启动并显示一条错误消息 "httpd.exe Application error The instruction at "0x006fb17f" referenced memory at "0x028a1e20" .内存不能"Written".点击确定.
我认为是多个线程在大约同一时间尝试刷新时发生刷新冲突造成的?我可以做些什么来解决它并刷新,因为有任何新的输出。
多线程不应该写标准输出,没有安全的方法来做到这一点。
Zend 没有提供使其安全的工具,它的工作是巧合的,并且永远是不安全的。