1

私はギアマンを使用して、実行時間の長いタスクを複数のワーカー サーバーに分散しています。ワーカー タスクの 1 つで、別のバックグラウンド ジョブを呼び出そうとしました。バックグラウンド ジョブは別のワーカーによって正常に実行されます... しかし、そのワーカー プロセスは、後で Gearman に追加された新しいジョブに応答しません。

何が起こっているのか知っている人はいますか?これがギアマンの特徴?

編集:

また、ワーカーを再起動すると、他のワーカーによってキューに入れられたタスクが繰り返されます。Gearman は、ジョブが完了したことを認識していないようです。

編集2:

試した:

var_dump($this->conn);
var_dump($this->handle);

他のワーカーから呼び出されたワーカー関数内から。これは私が受け取る出力です:

NULL
string(0) ""

編集3:

さて、私はこれを解決するハッキーな方法を思いつきました。以下は、関連するコードのスニペットです。私は自分のプロジェクトに codeigniter を使用しており、私のギアマン サーバーは配列として格納されています。ジョブ コードで接続が null かどうかをテストし、null の場合は、ランダムなギアマン サーバーを使用して再確立します。私はこれが悪いと確信しているので、誰かが洞察を改善した場合、私はそれを非常に感謝します.

class Net_Gearman_Job_notification_vc_friends_new_user extends Net_Gearman_Job_Common{

private $CI;

function __construct(){
    $this->CI =& get_instance();

    if(!$this->conn){

        $gearman = $this->CI->config->item('gearman');
        $servers = $gearman['servers'];
        $key = array_rand($servers);            
        $this->conn = Net_Gearman_Connection::connect($servers[$key]);

    }
}
4

1 に答える 1

0

理解した!実はかなりばかげています。parent::__construct(); を呼び出すのを忘れていました。私のコンストラクタで...おっと。

于 2011-11-13T21:04:18.133 に答える