2012-06-03 55 views

答えて

26

PCNTLはスレッドを作成できません。それは現在のPHPプロセスを "フォーク"するだけです。どういう意味ですか? pcntl_fork()に電話すると、現在のプロセスは2つのプロセスに分割されます。親プロセスの名前空間全体が子プロセスにコピーされ、両方のプロセスが1つの差異と並行して実行を継続します。pcntl_fork()は親のPIDを返し、子プロセスは0を返します。

いくつかのヒントが:

  • それはデフォルトで無効になっています。それを有効にすることができれば、それだけCLIのためにそれをしてください。 Webサーバーでこれを使用しないでください!それは非決定論的な方法で動作します。また、マシン全体をダウンさせることもできます。無効にしておいてください。
  • プロセス間の通信は可能ですが、恐ろしいです(共有メモリ内の シリアル化オブジェクト経由)。
  • ファイル記述子(およびデータベース 接続)が共有されているため、問題が頻繁に発生します。 をフォークした後にDBを再接続する必要があります。最初にフォークされたプロセスから、接続を閉じると、MySQL server has gone awayのようなエラーが発生します。
  • 親プロセスは子プロセスが完了するのを待たなければならないか、ゾンビを残すことになります。 プロセスがシステムリソースを消費しています。

ここでは、例from documentationです:

<?php 

$pid = pcntl_fork(); 
if ($pid == -1) { 
    die('could not fork'); 
} else if ($pid) { 
    // we are the parent 
    pcntl_wait($status); //Protect against Zombie children 
} else { 
    // we are the child 
} 

しかし、覚えて、PHPは言語だけをスクリプトされます。これは並列計算用に設計されたものではありません。必要に応じて、CRON、メッセージキュー、または下位言語のプログラムを同時に実行すると、より良い仕事をすることができます。

フォークされたPHPプログラムは、読み込み、理解、デバッグが非常に難しいです。そのプログラムを維持することは悪夢になるでしょう。

間違えたり、フォークを避けたりしないでください。あなたはそれを必要としません。本当に必要なのは、非同期タスクランナーです。グッドニュース、RabbitMQnice tutorialがある;-)またRabbitMQのライブラリを約束してみてくださいPS Bunny

と呼ばれる:代わりにフォークのメッセージキューを使用すると、あなたに1つ以上という利点があります。複数のサーバーでキューを処理し、トラフィックが増加するにつれて水平方向に拡大縮小することができます。

+0

ありがとうございました。 –

関連する問題