3

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 は決して起動されません。どうしたの?

ありがとう!アレックス


バックグラウンド モードで実行すると、コールバックが起動しないようです。

4

2 に答える 2

1

プロセス関数の呼び出しにコールバックを設定してみてください

$client->addTaskBackground('my_task', 'payload');
$client->setCompleteCallback('complete');
$client->runTasks();
于 2011-07-05T15:00:51.957 に答える
0

私はそれを試してみましたが、実際には、クライアントを Gearman タスク自体として実行することになりました。クライアントは、ブラウザによって呼び出されたページの一部として呼び出されていました。このコンテキストでは、コールバックが尊重されていないようです。解決策は、コールバックをスケジュールするクライアントを Gearman が実行するメソッドに移動することでした。作業に「scheduleXXXX」関数を追加しました。これは、上記の流れとほぼ同じです。この関数は、シリアル化された「通常の」関数の入力を受け取りました。

于 2011-07-06T12:52:35.747 に答える