Проблема с состоянием работы Gearman

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

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

Solutions Collecting From Web of "Проблема с состоянием работы Gearman"

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"; код <?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; } 

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

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