Клиент Gearman тайм-аут в случайном порядке при добавлении работы. Я не могу воссоздать условия, чтобы вызвать сбой. Демон Gearman работает!
Условия: загрузка пакета файлов в очередь в Gearman для изменения размера. Я могу загрузить сотни без ошибок. Однако время от времени не может быть отправлено одно задание со следующей ошибкой:
gearman_wait(GEARMAN_TIMEOUT) timeout reached,
1 servers were poll(), no servers were available, pipe:false ->
libgearman/universal.cc:328
Тем не менее, задания, представленные непосредственно до и после неудачной работы, проходят! Я даже могу повторно загрузить то же изображение, и оно проходит со второй попытки. Есть сервер gearman … это какой-то глюк с расширением gearmand или php-pecl-gearman ??
Конфигурация gearmand:
OPTIONS="--port=4730 \
--verbose=NOTICE \
--log-file=/var/log/gearman/gearmand.log \
--keepalive \
--threads=4 \
--queue-type=MySQL \
--mysql-host=localhost \
--mysql-port=xxx \
--mysql-user=xx \
--mysql-password=xx \
--mysql-db=xxxD \
--mysql-table=gearman_queue \
--job-retries=5"
Расширение PHP Gearman (PECL)
gearman support => enabled
extension version => 1.1.2
libgearman version => 1.1.8
Default TCP Host => localhost
Default TCP Port => 4730
Журналы показывают все принятые работы, ничего не отмечено для невыполненной работы
NOTICE 2015-02-02 16:25:54.000000 [ proc ] accepted,worker_name,jobidprefix65468823354cfa51234fa09.3540767125336,0 -> libgearman-server/server.cc:314
NOTICE 2015-02-02 16:25:56.000000 [ proc ] accepted,worker_name,jobidprefix40605707054cfa51438b0d0.383048589216,0 -> libgearman-server/server.cc:314
NOTICE 2015-02-02 16:25:56.000000 [ proc ] accepted,worker_name,jobidprefix197198183754cfa51447dac9.5387112932157,0 -> libgearman-server/server.cc:314
Перед отправкой задания я даже пингую чертов сервер, чтобы убедиться, что он там есть! Результат пинга был правдой !!
$gmclient= new GearmanClient();
$gmclient->addServer("127.0.0.1", ((int)$gearmanPort)); # Add default server (localhost).
$gmclient->setTimeout(300);//set timeout to send gearman errors
//assign a unique id for the job (limit the length to prevent db errors)
$uniqueid = substr('jobPrefix'.uniqid (rand (),true).rand(0, 32767), 0, 63);
//add the job to the background
$job_handle = $gmclient->addTaskBackground("worker_name", $jobdata, null, $uniqueid);
//ping gearman to make sure it is working before sending job
//keep trying for 2 seconds (4 times per second) until success or failure
$pingCount = 1;
while (@$gmclient->ping(serialize("Ping Test")) === FALSE && $pingCount <= 8) {
$this->log('Couldnt ping gearman server on pingCount='.$pingCount.'/8');
usleep(250000); //sleep for 0.25 seconds before trying again
$pingCount++;
}
//queue the job
if (@!$gmclient->runTasks()) //supress gearman fatal errors so we can catch them
{
throw new CHttpException(500,"ERROR " . $gmclient->error());
}
if (@$gmclient->returnCode() != GEARMAN_SUCCESS) //supress gearman fatal errors so we can catch them
{
throw new CHttpException(500,'ERROR: Bad return code for brokenlinkcheck '.$gmclient->returnCode());
}
$gmclient->setTimeout(300);
Есть неприятная ошибка с таймаутами, когда она установлена для рабочего на сервере заданий Gearman. Вы также установили тайм-аут в рабочем сценарии? Попробуйте удалить это.
Других решений пока нет …