私はギアマンを使用して、実行時間の長いタスクを複数のワーカー サーバーに分散しています。ワーカー タスクの 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]);
}
}