PHP的pthreads没有在Apache中执行并行线程

时间:2013-03-01 11:21:59

标签: php pthreads pthreads-win32

我正在使用PHP的pthreads扩展名。当我在Windows上从cmd执行PHP脚本时,我获得了并行线程,但是当我从Apache调用相同的脚本时,我获得了不同的结果,在我看来,就像单线程执行一样。

是否有任何配置我应该让Apache获得cmd(并行)等响应?

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 
...

更新:在不同的浏览器上我得到不同的结果;这个问题可能与缓冲区有关,我将对此进行调查。

1 个答案:

答案 0 :(得分:2)

没有模拟,你正在执行真正的线程。

您不应该在SAPI模式下从线程编写标准输出,您将遇到意外的行为和错误,无法控制,有太多的环境和SAPI可以很好地覆盖它,所以它根本没有涵盖,不要不这样做。

即使在CLI模式下,复杂代码的输出也会出现乱码,要解决此问题,您可以在传递给所有负责编写标准输出的上下文的对象中定义受保护的方法,如果方法受到保护且对象是一个pthreads,只有一个上下文能够一次编写标准输出...通过交换日志数据库的标准输出,可以在SAPI环境中使用相同的对象......