2024年PHP开发者大会日本站

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 条笔记

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

<?php // 工作进程
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;
// 删除此行可使用列表中最后一个可用的服务器
}
}
return
$connected;
}
}

echo
"启动中...\n";

# 添加一些服务器
$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')
);

# 创建工作进程对象。
$gmw= new SmartGearmanWorker();

if (
$gmw->connect($servers)) {
# 向服务器注册函数 "reverseString"。
$gmw->addFunction("reverseString", "reverseString_fn");

print
"已连接到 {$gmw->server['host']}:{$gmw->server['port']}...\n";
print
"等待任务...\n";

while (
$gmw->work()) {
if (
$gmw->returnCode() != GEARMAN_SUCCESS) {
echo
"返回码: " . $gmw->returnCode() . "\n";
break;
}
}

echo
"完成\n";
} else {
echo
"无法连接到任何gearman-job-servers.".PHP_EOL;
};

function
reverseString_fn($job)
{
echo
"收到任务: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo
"工作负载: $workload ($workload_size)\n";

# 发送一些进度信息
for ($x= 0; $x < $workload_size; $x++) {
echo
"发送状态: " . ($x + 1) . "/$workload_size 完成\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($workload);
echo
"结果: $result\n";

# 返回要发送回客户端的内容。
return $result;
}
2
brainreflex at gmail dot com
9年前
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']);
}
}

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

class SmartGearmanWorker extends GearmanWorker
{
function addServer($host = '127.0.0.1', $port = 4730):bool
{
try {
parent::addServer($host, $port);
echo "\n服务器 $host 连接成功";
} catch (GearmanException $e) {
echo "\n服务器 $host 连接失败";
}
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 "\n服务器 $host 连接成功";
} catch (GearmanException $e) {

echo "\n服务器 $host 连接失败"; //即使服务器关闭,此代码也不会被调用
}
return true;
}
}
0
kosta250 at gmail dot com
9年前
补充Amit的评论,我发现如果服务器列表中的第一台服务器关闭,似乎无法处理这种情况。
0
info at phpgangsta dot de
11年前
从几个版本开始,端口参数不再是可选的。我使用的是与libgearman 1.1.5编译的pecl/gearman 1.1.1版本,我收到以下错误

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

如果未提供端口,则会发生这种情况。

只需将第二个参数设置为4730,它就可以再次工作。
-1
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

?>
-1
Amit
11年前
当任何地址不可用时,addServer 和 addServers 函数处理方式非常严格。我尝试使用异常处理,但效果不佳。您能否提供一个可行的示例,用于处理包含一个或多个不可运行服务器的服务器列表?

谢谢
To Top