2013-03-01 12 views
7

PHP用にpthreads拡張機能を使用しています。私がWindows上でcmdからPHPスクリプトを実行すると、私は並列スレッドを取得しますが、Apacheから同じスクリプトを呼び出すと、別の結果が得られ、それは私にはシングルスレッド実行のようです。PHP用のpthreadはApacheで並列スレッドを実行していません

cmd(パラレル)のような応答を得るためにApacheに行うべき設定はありますか?

Webブラウザで
Yoo World ----------<br> 
Yoo World ----------<br> 
Yoo World ----------<br> 
Standard <br> 
Standard <br> 
Yoo World ----------<br> 
Yoo Second -------------------------<br> 
Standard <br> 
Standard <br> 

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で応答を与える

アップデート:私は別の結果を得る別のブラウザでは、この問題はbufferに関連している可能性があります。これについては調査します。

+1

各非同期操作に1秒のスリープを入れますか? – Blacksonic

+0

結果はかなり同じです。 –

+0

混在した文字列の出力はどのようなものでしたか?スレッド関数で文字列を分割し、最初の文字列を出力してから数ミリ秒間スリープして2番目の文字列を出力します。 – SparKot

答えて

2

実際のスレッドは実行されていません。

SAPIモードでスレッドから標準出力を書き込むのではなく、予期せぬ動作やエラーが発生したり、制御できない、SAPIがあまりにも多くの環境をカバーしているため、それをしないでください。

複雑なコードの出力が文字化けし、この問題を回避するために、メソッドが保護されている場合は、標準出力を処理するすべてのコンテキストに渡すオブジェクトに保護されたメソッドを定義できます。オブジェクトがpthreadsである場合、一度に1つのコンテキストだけが標準出力を書き込むことができます...同じオブジェクトは、ロギングデータベースの標準出力を交換することによってSAPI環境で使用できます。

+0

あなたはどのように正確にそれを行うことができるか私はどこのサンプルコードがありますか?私は良い練習の話題がある場合は、それらを読んでみたいと思います。 –

+1

http:// stackoverflow。com/a/14565559/1658631には、保護されたメソッドを使用してコンソールへの出力が同期される例が含まれています。多種多様なトピックをカバーするpthreadの配布には多くの例があります。 –

+0

@EmrahMehmedovまた、結果をスタック可能にシンクしてprint_rを使って、どのように処理されたかを見ることができます....何もシミュレートされていません – Baba

関連する問題