0

私は現在、次のものを持っています:

try {
    $pheanstalk->useTube($tube)->put($data);
} catch (\Exception $e) {
    $logger = $this->container->get('logger');
    $logger->info('Could not reach beanstalk: ' . $e);
}

これは正常に機能$pheanstalk->useTube($tube)->put($data)しますが、サーバーからの接続応答を待たずに、データをキューに入れようとしてから、楽しい方法で続行するようにしたいと考えています。このサービスが保存しているデータがあると便利ですが、重要ではありません。したがって、負荷の高い時間帯に、プログラムの残りの部分を続行できるようになるまで、タイムアウト期間を待つ必要がないようにしたいと考えています。pheanstalk のサーバー部分からの応答の待機をなくすにはどうすればよいですか?

4

1 に答える 1

0

ブロッキングを防ぐには、プロセスを fork する必要があります。

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     // proceed with whatever
} else {
     // we are the child
     $exitStatus = -1;
     try {
         $pheanstalk->useTube($tube)->put($data);
         $exitStatus = 1;
     } catch (\Exception $e) {
         $logger = $this->container->get('logger');
         $logger->info('Could not reach beanstalk: ' . $e);
         $exitStatus = 0;
     }

     exit($exitStatus); 
}

これが行うことは、プロセスを fork し、pheanstalk が戻るまで子プロセスを待機させることです。ただし、他にもいくつかの懸念があることに注意してください。

  • キジの木が二度と戻ってこない場合はどうなりますか? 子プロセスがゾンビになります。
  • プロセスのフォークには、多くのプロセス変数のコピーが含まれます。これにはオーバーヘッドがないわけではないため、必ずしも負荷が軽減されるとは限りません。あなたがその後にしていることは何でも本当の仕事であるなら、それは価値があるかもしれません.

理論的には、同じボックス上のローカルキューイング システムにメッセージを渡すことができます。このシステムの仕事は、メッセージをリモートシステムに置くことです。これにより、非常に迅速な応答が得られますが、より多くのコーディングが必要になる場合があります。ただし、すでにローカルの Beanstalk インスタンスがある場合、これは役に立ちません。(そうではないと思います。Beanstalk へのローカル呼び出しは高速です。ローカル呼び出しがある場合、問題はおそらくワーカー/コンシューマー側にあります。)

于 2013-06-19T23:19:56.780 に答える