9

PHP サーバー側 API で多くの MySQL クエリを作成している時点で、複数のスレッドが異なるクエリで動作し、結果を返すことで速度を上げたいと考えています。

しかし、PHP で別のスレッドを作成するにはどうすればよいでしょうか。私は POST パラメータを渡しているので、単純なshell_exec()ものでも機能しますが、ちょっと安全ではないようです。私が検討しているオプション:

1)私が持っているパラメータを使用してcURLリクエストを作成し、リクエストからJSONを処理してから返します

2) PHP CLI で a を呼び出し、shell_exec()どういうわけか (どうすればよいでしょうか??) PHP で応答を処理します。

ここで最良の選択肢は何ですか?

4

3 に答える 3

4

PHP ではスレッド化はサポートされていません。ただし、pcntl拡張機能を使用してフォークを生成および管理することはできますが、スレッド化を使用する必要があるという結論に達した場合は、アルゴリズムをもう一度確認することをお勧めします。

長時間実行される操作を非同期的に処理するためのオプションは、それらをデータベースに保存し、バックグラウンド ワーカー プロセスでデータベースからそれらを取得し、結果を計算してから、結果をデータベースに保存することです。次に、正面向きのスクリプトがデータベースでそれらを調べて、それらが完了したかどうか、および結果が何であるかを確認します。

于 2012-04-26T02:22:37.663 に答える
3

pcntl 拡張機能を確認してください。PHP は真のスレッド化をまったくサポートしていないため、fork()ing によって疑似スレッドを実装する必要があります。プロセスを fork() することは、スレッドを生成することよりもはるかに「重い」ことに注意してください。

于 2012-04-26T02:25:21.023 に答える
2

PHP のライブラリの多くはスレッド セーフではないため、PHP はスレッドを実装していません (今後も実装しない可能性があります)。その代替手段は、C関数pcntlをラップするものです。fork

これらの関数をより高いレベルで管理できる便利なラッパーを作成しました

$thread1 = new Thread( function( $thread ) {
    sleep( 4 );
    $thread->write( "Hello\n" );
} );

$thread2 = new Thread( function( $thread ) {
    sleep( 5 );
    $thread->write( "World\n" );
} );

$thread3 = new Thread( function( $thread ) {
    sleep( 6 );
} );

print $thread1->read(); // time: 0 -> 4
print $thread2->read(); // time: 4 -> 5
$thread3->join(); // time 5 -> 6

// More advanced handling:
// Thread::selectUntilJoin( array( $thread1, $thread2, $thread3 ), function () { ... }, function () { ... } );
于 2012-04-26T02:37:46.087 に答える