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