GearmanClient::addServer

(PECL gearman >= 0.5.0)

GearmanClient::addServer将作业服务器添加到客户端

说明

public GearmanClient::addServer(string $host = null, int $port = 0, bool $setupExceptionHandler = true): bool

将作业服务器添加到可用于运行任务的服务器列表中。在此处不会发生套接字 I/O;服务器只是被添加到列表中。

参数

host

作业服务器主机名。

port

作业服务器端口。

返回值

如果成功则返回 true,如果失败则返回 false

示例

示例 #1 添加两个作业服务器

<?php

# 创建我们的客户端对象。
$gmclient= new GearmanClient();

# 添加两个作业服务器,第一个在默认的 4730 端口上
$gmclient->addServer("10.0.0.1");
$gmclient->addServer("10.0.0.2", 7003);

?>

参见

添加备注

用户贡献备注 8 条备注

jqv8gg681 at relay dot firefox dot com
2 年前
结合 brainreflex 和 iloveapplepie 的建议,以及数小时的测试。这避免了跨平台的 gearman 版本之间的一些错误。
它逐步遍历服务器列表,如果所有服务器都无法访问,则失败。
我也对客户端使用与“class SmartGearmanClient extends GearmanClient”相同的覆盖。

<?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;
}
brainreflex at gmail dot com
8 年前
Amit, kosta250

我找到了一个解决方法,可以避免死服务器并继续使用其他服务器。

<?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']);
}
}

?>
iloveapplepie
2 年前
有时您希望作业服务器即使在并非所有服务器都可用时也启动。原因是,如果服务器在稍后时间恢复,即使在添加服务器操作期间失败,gearman 也会使用它。

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"; // 即使服务器已关闭,也不会调用此函数
}
return true;
}
}
kosta250 at gmail dot com
8 年前
补充 Amit 的评论,我发现如果服务器列表中的第一个服务器关闭,似乎无法处理这种情况。
info at phpgangsta dot de
11 年前
从几个版本开始,端口参数不再是可选的。我的 pecl/gearman 版本是 1.1.1,用 libgearman 1.1.5 编译,出现以下错误

send_packet(GEARMAN_COULD_NOT_CONNECT) 无法发送服务器选项包 -> libgearman/connection.cc:430

如果未提供端口,则会发生此错误。

只需将第二个参数设置为 4730,即可解决问题。
michael at butlerpc dot net
5 年前
在 2.0.5 版本之前,addServer 会间接执行套接字 I/O,因为它内部调用 set_server_option 以进行异常处理程序。这意味着如果服务器无法访问,您将在此时收到 GearmanException 异常,并且您可能希望在应用程序中捕获并处理它。

<?php

$client
->addServer('127.0.0.1', 4321); // 会尝试套接字连接!

?>

从扩展的 2.0.5 版本开始,可以传递第三个布尔参数(在 $port 之后)false 以防止这种情况发生。

<?php

$client
->addServer('127.0.0.1', 4321, false); // 此处不会发生套接字 I/O

?>
Amit
10 年前
当任何地址都不可用时,addServer 和 addServers 函数非常严格。我尝试使用异常,但效果不佳。你能提供一个处理服务器列表(其中一个或多个服务器未运行)的示例吗?

谢谢
To Top