16

PHPでは通常、サーバーの機能を考慮せずにコーディングを行います。現在、PCでさえ複数のコアを持ち、64ビットデータも処理しています。私の知る限り、PHPエンジン自体は、複数のコアを利用するように最適化されています。プログラマーがコードをさらに最適化して、複数のコアを活用するにはどうすればよいでしょうか。

言い換えれば、並列処理するためにphpエンジンによって考慮される可能性が高いコードを書くことを教えてくれるテクニックを知りたいのです。

私はユーザー定義/オープンソースのキューイング方法を求めているのではなく、マルチコアを利用してより高速に動作するように同じコードを書くことを求めています。

あなたがすでにこのようなことをしているなら、あなたの考えを提案し、あなたの経験を共有してください。

コードをさらに最適化できる方法があるはずです。

4

4 に答える 4

10

PHP を使用する最も一般的な方法は、Apache などのマルチプロセス Web サーバーを介して実行することです。これは、PHP 自体がマルチコアに対応していない場合でも、オペレーティング システムは Web サーバー プロセスによって作成された負荷を使用可能な CPU 間で分散するために最善を尽くすことを意味します。

単独のプロセスで実行するスタンドアロンの長期実行 PHP プログラムがある場合は、複数の CPU を利用できるように、プログラムをスレッド化するか、別のプロセスに分割するかを検討する必要があります。どちらが優れている/簡単かは、特定の状況によって異なります。タスクを細かく分割するのがどれほど簡単か、プロセス間/スレッド間通信がどれだけ必要か、必要な同期がどれくらいかなどです。

標準の PHP ディストリビューション自体はスレッド化をサポートしていないようですが、ネイティブAPIの使用を可能にするphp-pthreadsなどの拡張機能があります。pthreads

長時間実行される PHP プログラムを複数のプロセスに分割するには、pcntlライブラリまたはproc_*関数ファミリーを使用できます。IPCに関しては..再び、それはあなたのニーズに依存します。

于 2012-05-23T06:41:32.560 に答える
1

説明はすでに提供されているので、コードを直接入れます。あなたが求めたすべては、スレッドで達成できます。

require_once( 'Thread.php' );

// test to see if threading is available
if( ! Thread::available() ) 
{
   die( 'Threads not supported' );
}

// function to be ran on separate threads
function paralel( $_limit, $_name ) 
{
    for ( $index = 0; $index < $_limit; $index++ ) 
    {
        echo 'Now running thread ' . $_name . PHP_EOL;
        sleep( 1 );
    }
}

// create 2 thread objects
$t1 = new Thread( 'paralel' );
$t2 = new Thread( 'paralel' );

// start them
$t1->start( 10, 't1' );
$t2->start( 10, 't2' );

// keep the program running until the threads finish
while( $t1->isAlive() && $t2->isAlive() ) 
{
}

PHP 自体はスレッドをサポートしていないことに注意してください。詳細情報はこちらhttp://blog.motane.lu/2009/01/02/multithreading-in-php/

この回答に従うこともできます。これは、PHP と Threads についてのコード例についても説明しています。

スレッドは主にプロセスを異なるスレッドに分割して高速化するために使用され、サイトのトラフィックが多い場合、OS 自体が CPU の異なるコアでプロセスを管理するため、私は個人的には PHP スレッド化を使用しません。したがって、PHP スレッド化について心配する必要はないと思います。これが、PHP チームがそれに焦点を当てていない理由かもしれません (これは私の考えです)。

于 2014-06-05T15:39:54.283 に答える
-2

PHP は、マルチスレッドを念頭に置いて設計されているわけではありません (有効期間が短い要求/応答モデルを中心に構築されています)。ただし、いくつかのオプションがあります。

PCNTL 拡張: 子プロセスを生成および管理します。各子プロセスは新しい PHP インスタンスであるため、これはマルチスレッドではありません。したがって、かなりリソースを消費します。Windows では使用できません。

PThreads 拡張機能: PHP スクリプト内のスレッドの生成と管理を可能にします。これは (ドキュメントからわかる限り) Windows で利用可能であり、スレッドは理論的には生成プロセスよりも少し軽量である必要がありますが、それを使用するには非常に多くの注意事項があります。たとえば、PHP はスレッド セーフのためにコンパイルする必要があります。これは、スレッド化されていないコードのパフォーマンスに悪影響を及ぼす可能性があり、スレッド セーフをサポートしない拡張機能の使用を妨げる可能性があります。

ReactPHP: イベント ループやノンブロッキング IO などを提供する PHP コードのライブラリ。厳密に言えば、スレッドをサポートしているわけではありません (スレッドを提供する作業が進行中であることは理解しています) が、スレッドの必要性を軽減する多くの便利な機能を提供します。https://github.com/reactphp/react/wiki/FAQには、スレッド サポートの状態に関する議論が含まれています。

于 2014-06-05T15:52:04.940 に答える