Gearman を既存の PHP プロジェクトに正常に接続しました。ワーカーが実行されていることを確認するために Supervisord を使用すると、かなり良い結果が得られました。
ただし、「setCompleteCallback」がまったく機能しないという重大な問題があります。
次のように分割します。
クライアント
$client = new GearmanClient();
$client->addServer();
$client->setCompleteCallback(
array( 'LDPE_Service_AWSConnect_Transfer_Target', 'transferComplete' ) );
// push core to S3 bucket
$target = new LDPE_Service_AWSConnect_Transfer_Target( $transaction->id,
"/usr/local/include/LDP/", LDPE_Service_S3::BUCKET_CORE );
// push S3 bucket to instances
foreach( $aws_target_list as $dns )
{
$target->addChildRequest(
new LDPE_Service_AWSConnect_Transfer_Target( $transaction->id,
null, LDPE_Service_S3::BUCKET_CORE, $dns )
);
}
$client->addTaskBackground( 'transferStart', serialize( $target ) );
$client->runTasks();
ワーカー
(基本的に Zend Framework 環境をブートストラップし、exec 関数をロードします)
include 'bootstrap.php';
ini_set('memory_limit', -1);
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction( 'transferStart', array(
'LDPE_Service_AWSConnect_Transfer_Target', 'transferStart' ) );
while ($worker->work())
{
switch( $worker->returnCode() )
{
case GEARMAN_SUCCESS:
break;
default:
echo "ERROR RET: " . $worker->returnCode() . "\n";
exit;
}
}
最後に、すべての面倒な作業を含む LDPE_Service_AWSConnect_Transfer_Target クラスを次に示します。すべてのロジックを削除しましたが、まったく起動しません。
実装方法
class LDPE_Service_AWSConnect_Transfer_Target {
public static function transferStart( GearmanJob $job )
{
$workload = $job->workload();
$target = unserialize( $workload );
echo "transferStart/begin [ " .
$target->getShortRepresentation() . " ]\n";
// perform a series of actions
echo "transferStart/complete [ " .
$target->getShortRepresentation() . " ]\n";
return serialize( $target );
}
public static function transferComplete( GearmanTask $task )
{
echo "transferComplete/begin\n";
$workload = $task->data();
$parent_target = unserialize( $workload );
echo "transferComplete/complete\n";
}
}
明確にするために、「transferStart/begin」および「transferStart/complete」文字列はログに正しく出力されますが、transferComplete/begin は決して起動されません。どうしたの?
ありがとう!アレックス
バックグラウンド モードで実行すると、コールバックが起動しないようです。