GearmanClient::addServer
(PECL gearman >= 0.5.0)
GearmanClient::addServer — Добавить сервер задач для клиента
Описание
public bool GearmanClient::addServer
([ string
$host
= 127.0.0.1
[, int $port
= 4730
]] )Добавляет сервер задач к списку серверов, которые могут использоваться для выполнения задачи. Никаких операций ввода-вывода c сокетом здесь не происходит. Сервер просто добавляется к списку.
Список параметров
-
host
-
Имя хоста сервера задач.
-
port
-
Порт сервера задач.
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Примеры
Пример #1 Добавление двух серверов задач
<?php
# Создаем клиентский объект
$gmclient= new GearmanClient();
# Добавляем два сервера задач, первый из них работает с портом 4730 по умолчанию
$gmclient->addServer("10.0.0.1");
$gmclient->addServer("10.0.0.2", 7003);
?>
- Функция GearmanClient::addOptions() - Добавить клиентские опции
- Функция GearmanClient::addServer() - Добавить сервер задач для клиента
- Функция GearmanClient::addServers() - Добавить список серверов задач для клиента
- Функция GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
- Функция GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
- Функция GearmanClient::addTaskStatus() - Добавить задачу для получения статуса
- Функция GearmanClient::clearCallbacks() - Очистить все функции обратного вызова данной задачи
- Функция GearmanClient::clone() - Создать копию объекта GearmanClient
- Функция GearmanClient::__construct() - Создать экземпляр GearmanClient
- Функция GearmanClient::context() - Возвращает контекст приложения
- Функция GearmanClient::data() - Возвращает данные приложения (функция устарела)
- Функция GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
- Функция GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
- Функция GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
- Функция GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doJobHandle() - Получить дескриптор выполняющейся задачи
- Функция GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
- Функция GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме
- Функция GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
- Функция GearmanClient::doStatus() - Получение статуса обработки задания
- Функция GearmanClient::echo() - Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
- Функция GearmanClient::error() - Вернуть строку ошибки для последней встретившейся ошибки
- Функция GearmanClient::getErrno() - Получить значение errno
- Функция GearmanClient::jobStatus() - Получение статуса выполнения фонового задания
- Функция GearmanClient::ping() - Отправляет данные на все сервера и смотрит, какие из них выведут эти данные
- Функция GearmanClient::removeOptions() - Удалить клиентские опции
- Функция GearmanClient::returnCode() - Получить последний возвращённый код Gearman
- Функция GearmanClient::runTasks() - Запустить список задач в параллельном режиме
- Функция GearmanClient::setClientCallback() - Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
- Функция GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
- Функция GearmanClient::setContext() - Установить данные приложения
- Функция GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
- Функция GearmanClient::setData() - Установить данные приложения (устаревший метод)
- Функция GearmanClient::setDataCallback() - Задает callback-функцию для обработки переданных данных
- GearmanClient::setExceptionCallback
- GearmanClient::setFailCallback
- Функция GearmanClient::setOptions() - Задание настроек клиента
- Функция GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
- Функция GearmanClient::setTimeout() - Установка таймаута для операций ввода/вывода
- Функция GearmanClient::setWarningCallback() - Задание callback-функции, обслуживающей предупреждения обработчика заданий
- GearmanClient::setWorkloadCallback
- Функция GearmanClient::timeout() - Получение значения таймаута операций ввода/вывода
Коментарии
Since a few versions the port parameter is not optional anymore. I have version 1.1.1 of pecl/gearman compiled with libgearman 1.1.5, and I'm getting the following error:
send_packet(GEARMAN_COULD_NOT_CONNECT) Failed to send server-options packet -> libgearman/connection.cc:430
This happens if you don't provide a port.
Just set the second parameter to 4730 and it is working again.
The addServer and addServers are unforgiving when any of the addresses are down. I tried using exceptions, but it does not quite work. Can you provide a working example to handle a list of servers where one or more is not running.
Thanks
Solution:
https://bugs.launchpad.net/gearmand/+bug/1118751
Adding to Amit's comments, I found that if the first server in the list of servers is down, then there seems to be no way to handle such a condition.
Amit, kosta250
I found a workaround to avoid the dead servers and continue with rest alive.
<?php
$servers = array(
array('host' => '127.0.0.1', 'port' => '4730'),
array('host' => '127.0.0.1', 'port' => '4731'),
array('host' => '127.0.0.1', 'port' => '4732'),
array('host' => '127.0.0.2', 'port' => '4730')
);
$client= new \GearmanClient();
foreach($servers as $server) {
$c = new \GearmanClient();
$c->addServer($server['host'], $server['port']);
if (@$c->ping('ping')) {
$client->addServer($server['host'], $server['port']);
}
}
?>
Prior to version 2.0.5, addServer DOES perform socket I/O indirectly because it calls set_server_option internally for an exception handler. This means if the server is unreachable you will get a GearmanException thrown at this point, and you may want to catch and handle it in your application.
<?php
$client->addServer('127.0.0.1', 4321); // does attempt a socket connection!
?>
Starting with version 2.0.5 of the extension, a third boolean argument (after $port) may be passed false in order to prevent this from happening.
<?php
$client->addServer('127.0.0.1', 4321, false); // no socket i/o happens here
?>
Sometimes you want the job server to start even if not all servers are available. The reason is that if at a later point the server comes back gearman will use it, even if if failed during the add server operation.
class SmartGearmanWorker extends GearmanWorker
{
function addServer($host = '127.0.0.1', $port = 4730):bool
{
try {
parent::addServer($host, $port);
echo "\nSERVER $host WORKED";
} catch (GearmanException $e) {
echo "\nSERVER $host FAILED";
}
return true;
}
}
class SmartGearmanClient extends GearmanClient
{
function addServer($host = '127.0.0.1', $port = 4730, bool $setupExceptionHandler = false):bool
{
try {
parent::addServer($host, $port, $setupExceptionHandler);
echo "\nSERVER $host WORKED";
} catch (GearmanException $e) {
echo "\nSERVER $host FAILED"; //this does not get called even if the server is down
}
return true;
}
}
Combining recommendations from brainreflex and iloveapplepie, as well as hours of testing. This avoids some bugs in cross versions of gearman across platforms.
It steps though the server list and fails if all are inaccessible.
I also use the same override as "class SmartGearmanClient extends GearmanClient" for the clients.
<?php // WORKER
class SmartGearmanWorker extends GearmanWorker
{
public $server = false;
public function connect($servers = array( array('host' => '127.0.0.1', 'port' => '4730') ))
{
$connected = false;
foreach ($servers as $server) {
$c = new GearmanClient();
$c->addServer($server['host'], $server['port'], false);
if (@$c->ping('ping')) {
$this->addServer($server['host'], $server['port']);
$connected=true;
$this->server = array(
'host'=>$server['host'],
'port'=>$server['port']
);
break; // Remove this to use last working server in list
}
}
return $connected;
}
}
echo "Starting\n";
# Add some servers
$servers = array(
array('host' => '127.0.0.1', 'port' => '4730'),
array('host' => '127.0.0.1', 'port' => '4731'),
array('host' => '127.0.0.1', 'port' => '4732'),
array('host' => '127.0.0.2', 'port' => '4730'),
array('host' => '192.168.204.10', 'port' => '4730')
);
# Create our worker object.
$gmw= new SmartGearmanWorker();
if ($gmw->connect($servers)) {
# Register function "reverseString" with the server.
$gmw->addFunction("reverseString", "reverseString_fn");
print "Connected to {$gmw->server['host']}:{$gmw->server['port']}...\n";
print "Waiting for jobs...\n";
while ($gmw->work()) {
if ($gmw->returnCode() != GEARMAN_SUCCESS) {
echo "return_code: " . $gmw->returnCode() . "\n";
break;
}
}
echo "DONE\n";
} else {
echo "Unable to connect to any gearman-job-servers.".PHP_EOL;
};
function reverseString_fn($job)
{
echo "Received job: " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Workload: $workload ($workload_size)\n";
# Lets send some progress information
for ($x= 0; $x < $workload_size; $x++) {
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}
$result= strrev($workload);
echo "Result: $result\n";
# Return what we want to send back to the client.
return $result;
}