apache — PHP pthreads, в задачах пула, ob_flush и 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 (); в резьбовом объекте, и он в основном работает, как ожидалось. Таким образом, приведенный выше код не гарантированно завершится каждый раз, но если вы запустите его еще несколько раз, иногда сценарий останавливается и Apache перезапускается с сообщением об ошибке «httpd.exe Ошибка приложения. Инструкция по адресу« 0x006fb17f »ссылается на память по адресу« 0x028a1e20 ». Msgstr «Память не может быть» записана «. Нажмите OK.»

Я думаю, что это вызвано сбрасыванием конфликта нескольких потоков, когда они пытаются сбросить примерно в одно и то же время? Что я могу сделать, чтобы обойти это и очистить, поскольку есть какой-либо новый вывод.

1

Решение

Несколько потоков не должны записывать стандартный вывод, безопасного способа для этого не существует.

Zend не предоставляет никаких средств, чтобы сделать его безопасным, он работает по совпадению и всегда будет небезопасным.

2

Другие решения

Других решений пока нет …