Проблема со статусом работы Gearman - PullRequest
5 голосов
/ 14 апреля 2011

У меня на сервере Gearman запущен процесс, выполнение которого занимает несколько минут. Я запускаю индикатор выполнения, чтобы показать завершение, и пытаюсь получить проценты для индикатора, используя расширение Gearman PHP и функцию jobStatus ().

Задание определенно активно и найдено, так как первые два поля (известные + все еще работающие) возвращаются в true. Однако третье и четвертое поля (числитель и знаменатель процента выполнения) возвращаются ни с чем. Кто-нибудь знает, почему это может быть или как эти числа вычисляются?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011
public bool GearmanJob::sendStatus ( int $numerator , int $denominator )

Отправка информации о состоянии на сервер заданий и любые прослушивающие клиенты.Используйте это, чтобы указать, какой процент задания был выполнен.

Чтобы иметь возможность его использовать, вам, вероятно, также придется немного изменить клиента для обработки связи.

Пример

client.php

<?php
global $argc,$argv;

if (!file_exists($argv[1])) {
        echo "File not found\n";
        exit(1);
}

$gmclient= new GearmanClient();
$gmclient->addServer();
do
{
  $result = $gmclient->do("linecount", file_get_contents($argv[1]));
  # Check for various return packets and errors.

  switch($gmclient->returnCode())
  {
    case GEARMAN_WORK_STATUS:
      list($numerator, $denominator)= $gmclient->doStatus();
      echo "Status: " . sprintf("%d%%",($numerator/$denominator)*100)
             . " complete\r";
      break;
    case GEARMAN_SUCCESS:
      break;
  }
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

echo "\nResult: $result\n";

worker.php

<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("linecount", "linecount");
while ($worker->work());

    function linecount($job)
    {
            $lines = preg_split('/[\r\n]/',
                       $job->workload(),null,PREG_SPLIT_NO_EMPTY);
            $linecount = count($lines);
            $n = 0;
            foreach ($lines as $line) {
                    usleep(3000);
                    $n++;
                    $job->sendStatus($n,$linecount);
                    $ret++;
            }
            return $ret;
    }
0 голосов
/ 14 апреля 2011

Рабочий настроен на возвращение статуса?

Если вы пишете их самостоятельно, вам придется проделать дополнительную работу, чтобы заставить их возвращать детали по мере их поступления.

...