7

PHP用のpthreads拡張機能を使用しています。WindowsでPHPスクリプトを実行すると、cmd並列スレッドが取得されますが、Apacheから同じスクリプトを呼び出すと、異なる結果が得られ、単一スレッドの実行のように見えます。

cmdApacheが(並列)のような応答を得るために作成する必要のある構成はありますか?

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ブラウザの場合:

Yoo World ----------
Yoo World ----------
Yoo World ----------
Yoo World ----------
...
Yoo Second -------------------------
Yoo Second -------------------------
Yoo Second -------------------------
Yoo Second -------------------------
...
Standard 
Standard 
Standard 
Standard 
...

更新:ブラウザが異なれば、結果も異なります。この問題は、これから調査するバッファに関連している可能性があります。

4

1 に答える 1

2

何もシミュレートされていません。実際のスレッドを実行しています。

スレッドからの標準出力をSAPIモードで記述しないでください。予期しない動作やエラーが発生し、制御できなくなります。環境やSAPIが多すぎてカバーできないため、まったくカバーされません。それ。

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

于 2013-03-02T12:52:45.567 に答える