0

私が得た:

  • デビアン 6
  • nginx 1.2.6
  • PHP 5.3.20-1~dotdeb.0 (fpm-fcgi) (ビルド: 2012 年 12 月 24 日 11:53:16)
  • ギアマンド 1.1.4
  • pecl ギアマン ext 1.1.1

そして、2 つのスクリプトを取得しました (おそらく、php からコピーしたものです)。クライアント:

<?php
$gmc= new GearmanClient();
$gmc->addServer();

$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");

$gmc->addTask("reverse", "!dlroW olleH", null, "2");

if (!$gmc->runTasks())
{
    echo "Error " . $gmc->error() . "\n";
    exit;
}

echo "Done\n";

function reverse_status($task)
{
    echo "Status: " . $task->unique() . ", " . $task->jobHandle() . " - " . $task->taskNumerator() .
         "/" . $task->taskDenominator() . "\n";
}

function reverse_complete($task)
{
    echo "Done: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

そして労働者:

<?php
$gmworker= new GearmanWorker();
$gmworker->addServer('127.0.0.1');
$gmworker->addOptions(GEARMAN_WORKER_GRAB_UNIQ);
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for tasks...\n";
while($gmworker->work())
{

  if ($gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo "return code: " . $gmworker->returnCode() . "\n";
    break;
  }
}

function reverse_fn($job)
{

  echo "uniq: " . $job->unique() . "\n";
  echo "I got job: " . $job->handle() . "\n";

  $workload = $job->workload();
  $workload_size = $job->workloadSize();

  echo "Workload: $workload ($workload_size)\n";

  for ($x= 0; $x < $workload_size; $x++)
  {
    echo "Sending status: " . ($x + 1) . "/$workload_size is done\n";
    $job->sendStatus($x+1, $workload_size);
    $job->sendData(substr($workload, $x, 1));
    sleep(1);
  }

  $result= strrev($workload);
  echo "The result: $result\n";

  return $result;
}

?>

「ギアマンド -d」でギアマンドを実行します。「php worker.php」でワーカーを起動します。

ブラウザからクライアント スクリプトを開くと、タスクがサーバーに送られ、すべて問題ありません。しかし、2 つ以上のブラウザー タブから同じスクリプトを開くと、gearmand は同じ一意の ID を持つ 2 つ以上の同様のタスクを受け取ります。

バックグラウンド タスクを追加したり、doBackground メソッドを使用したり、CLI モードで使用したりすると、これは発生しません。また、2 つ以上の異なるブラウザーからは発生しません。

クライアントとサーバーのさまざまなバージョンを試しました。同じことが起こります。

私は完全に立ち往生しています。助けてくれてありがとう。

4

2 に答える 2

0

$ gmc-> addTask( "reverse"、 "!dlroW olleH"、null、 "2"); 最後のオプションは一意のキーです。もちろん、それは常に同じです。

于 2013-01-27T00:20:06.317 に答える