Проблема со статусом задания Gearman

#php #progress-bar #gearman

#php #индикатор выполнения #gearman

Вопрос:

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

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

Ответ №1:

 public bool GearmanJob::sendStatus ( int $numerator , int $denominator )
  

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

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

Пример

client.php

 <?php
global $argc,$argv;

if (!file_exists($argv[1])) {
        echo "File not foundn";
        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)
             . " completer";
      break;
    case GEARMAN_SUCCESS:
      break;
  }
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

echo "nResult: $resultn";
  

worker.php

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

    function linecount($job)
    {
            $lines = preg_split('/[rn]/',
                       $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;
    }
  

Комментарии:

1. функционирует ли этот код? я тестирую его без какого-либо успеха

2. Однажды он был протестирован и найден в рабочем состоянии вместе с gearmand 0.20 в 2011 году. Теперь, когда выпущен gearman 1.2, вероятно, в API внесены изменения между этими двумя выпусками.

3. вам удалось получить статус в клиенте? мой вообще не работает .. api gearman почти не меняется .. ваш код работает просто отлично .. мне просто интересно, либо у меня неправильная установка gearman

4. ах, ic, мой клиент вообще не получал никаких входных данных от сервера, returnCode не работает .. спасибо за ваш ввод

Ответ №2:

Настроен ли рабочий на возврат статуса?

Однако, если вы пишете их самостоятельно, вам придется проделать немного дополнительной работы, чтобы заставить их возвращать детали по мере их выполнения.

Комментарии:

1. Ах, большое спасибо, не знал, что воркер нужно настраивать. Какие-либо ресурсы, на которые вы можете указать, как именно настроить worker?

2. Вы сами написали пакет? Когда вы получаете задание, вы можете вернуть статус: php.net/manual/en/gearmanjob.sendstatus.php