【发布时间】:2015-09-03 22:30:14
【问题描述】:
我目前在这里看到的代码:
<?php
class workerThread extends Thread {
public function __construct($i) {
$this->i = $i;
}
public function run() {
echo $this->i . " ";
sleep(1);
echo $this->i . " ";
}
}
for ($i=1; $i<=5; $i++) {
$workers[$i]= new workerThread($i);
$workers[$i]->start();
}
?>
我希望这样做是回显 1 2 3 4 5,等待 1 秒,然后回显 1 2 3 4 5。但是,它会等待整个程序完成,然后吐出1 1 2 2 3 3 4 4 5 5。由于某种原因,它的行为不是异步的。我做错了什么?
编辑:使用usleep(1000000) 而不是sleep(1) 做同样的事情
【问题讨论】:
-
在当前 pthreads-master 中使用 PHP 7.0.0 RC1 我无法重现此问题。它的行为与您所说的完全一样。
-
很奇怪,我运行的是 PHP 5.6.12 和 pthreads 版本 2.0.10
-
即使使用来自pecl.php.net 的 PHP-CLI 5.6.12 和 pthreads 2.0.10,我也没有遇到这个问题。您是否在使用某种带有输出缓冲的特殊 SAPI?
-
嗯,这应该是一个经典的输出缓冲问题。 pthreads does not recommend 的作者将任何内容从线程写入输出缓冲区(即使在普通的 PHP-CLI 中也不行)。这可能会有所帮助:stackoverflow.com/a/31186883/2032498
-
不,恐怕您使用的 SAPI 无法做到这一点。在 Apache 开始将它们泵送到客户端之前,管中必须有一定数量的字节。
标签: php multithreading pthreads