pthreads for PHP不在Apache中执行并行线程

问题描述:

我使用PHP的pthreads扩展。当我在Windows上执行cmd的PHP脚本时,我得到并行线程,但是当我从Apache调用相同的脚本时,我得到了不同的结果,在我看来,像单线程执行一样。pthreads for 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> 

在Web浏览器中:

更新:在不同的浏览器我得到不同的结果;这个问题可能与我要研究的缓冲区有关。

+1

你试过在每次异步操作中放置1秒睡眠? – Blacksonic 2013-03-01 11:49:27

+0

结果非常相似。 – 2013-03-01 11:57:44

+0

你在期待什么混杂的字符串输出?然后在线程函数中分割字符串,输出第一个字符串然后睡几毫秒并输出第二个字符串。 – SparKot 2013-03-01 14:56:55

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

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

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

+0

你有没有任何示例代码,我可以看到如何做到这一点?我的意思是如果有好的练习题,我想阅读它们。 – 2013-03-03 15:48:57

+1

http:// *。com/a/14565559/1658631包含一个输出到控制台的示例使用受保护的方法进行同步,在涉及各种主题的pthread分布中包含了许多示例。 – 2013-03-04 15:33:03

+0

@EmrahMehmedov你也可以将结果汇集到堆栈并使用print_r来查看每个步骤是如何处理的....没有任何模拟 – Baba 2013-05-19 17:31:04