Я использую расширение pthreads для PHP. Когда я запускаю PHP-скрипт из cmd
в Windows, я получаю параллельные потоки, но когда я вызываю тот же скрипт из Apache, у меня получается другой результат, и мне кажется, что это однопоточное выполнение.
Есть ли какая-то конфигурация, которую я должен сделать для Apache, чтобы получить ответ вроде cmd
(parallel)?
class AsyncOperation extends Thread { public function __construct($arg){ $this->arg = $arg; } public function run(){ if($this->arg){ for($i = 0; $i < 50; $i++) { echo "Yoo " . $this->arg . "<br>\n"; } } } } $thread = new AsyncOperation("World ----------"); $thread2 = new AsyncOperation("Second -------------------------"); $thread->start(); $thread2->start(); for($i = 0; $i < 100; $i++) { echo "Standard <br>\n"; } $thread->join(); $thread2->join();
Пример кода дает ответ в cmd
как:
Yoo World ----------<br> Yoo World ----------<br> Yoo World ----------<br> Standard <br> Standard <br> Yoo World ----------<br> Yoo Second -------------------------<br> Standard <br> Standard <br>
В веб-браузере:
Yoo World ---------- Yoo World ---------- Yoo World ---------- Yoo World ---------- ... Yoo Second ------------------------- Yoo Second ------------------------- Yoo Second ------------------------- Yoo Second ------------------------- ... Standard Standard Standard Standard ...
Обновление: в разных браузерах я получаю разные результаты; эта проблема может быть связана с буфером, который я собираюсь исследовать.
Ничто не моделируется, вы выполняете реальные потоки.
Вы не должны записывать стандартный вывод из потоков в режиме SAPI, вы будете сталкиваться с неожиданными поведением и ошибками, которые невозможно контролировать, слишком много сред и SAPI, чтобы покрыть его хорошо, поэтому он не распространяется вообще, не делайте Это.
Даже в режиме CLI вывод сложного кода будет искажен, чтобы обойти это, вы можете определить защищенный метод в любом объекте, который вы передаете во все контексты, которые заботятся о записи стандартного вывода, если этот метод защищен, а объект является pthreads один, только один контекст сможет писать стандартный вывод за один раз … тот же объект может быть использован в среде SAPI путем замены стандартного вывода для базы данных протоколирования …