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

Emr*_*dov 7 php pthreads pthreads-win32

我正在使用PHP 的pthreads扩展.当我从执行PHP脚本cmd在Windows上,我得到的并行线程,但是当我调用同一个脚本的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();
Run Code Online (Sandbox Code Playgroud)

示例代码给出响应,cmd如:

Yoo World ----------<br>
Yoo World ----------<br>
Yoo World ----------<br>
Standard <br>
Standard <br>
Yoo World ----------<br>
Yoo Second -------------------------<br>
Standard <br>
Standard <br>
Run Code Online (Sandbox Code Playgroud)

在网络浏览器中:

Yoo World ----------
Yoo World ----------
Yoo World ----------
Yoo World ----------
...
Yoo Second -------------------------
Yoo Second -------------------------
Yoo Second -------------------------
Yoo Second -------------------------
...
Standard 
Standard 
Standard 
Standard 
...
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ins 2

没有什么是模拟的,您正在执行真实的线程。

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

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