$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.»
Я думаю, что это вызвано сбрасыванием конфликта нескольких потоков, когда они пытаются сбросить примерно в одно и то же время? Что я могу сделать, чтобы обойти это и очистить, поскольку есть какой-либо новый вывод.
Несколько потоков не должны записывать стандартный вывод, безопасного способа для этого не существует.
Zend не предоставляет никаких средств, чтобы сделать его безопасным, он работает по совпадению и всегда будет небезопасным.
Других решений пока нет …