2024 日本 PHP 研討會

GearmanClient::addServer

(PECL gearman >= 0.5.0)

GearmanClient::addServer新增工作伺服器至用戶端

說明

公開 GearmanClient::addServer(字串 $host = null, 整數 $port = 0, 布林值 $setupExceptionHandler = true): 布林值

將一個工作伺服器添加到可用於執行任務的伺服器列表中。這裡不會發生任何 Socket 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
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']);
}
}

?>
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;
}
}
kosta250 at gmail dot com
9 年前
補充 Amit 的評論,我發現如果伺服器列表中的第一個伺服器關閉,那麼似乎沒有辦法處理這種情況。
info at phpgangsta dot de
11 年前
從幾個版本開始,port 參數不再是可選的。我使用 libgearman 1.1.5 編譯的 pecl/gearman 1.1.1 版,我收到以下錯誤

send_packet(GEARMAN_COULD_NOT_CONNECT) 無法傳送伺服器選項封包 -> libgearman/connection.cc:430

如果您沒有提供連接埠,就會發生這種情況。

只需將第二個參數設定為 4730,它就會再次正常工作。
michael at butlerpc dot net
5 年前
在 2.0.5 版之前,addServer 會間接執行 socket 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
11 年前
當任何地址失效時,addServer 和 addServers 都無法容錯。我嘗試使用例外處理,但效果不佳。您能否提供一個有效的範例來處理一個或多個伺服器未執行的伺服器清單?

謝謝
To Top