2024 年 PHP Conference Japan

GearmanClient::addTask

(PECL gearman >= 0.5.0)

GearmanClient::addTask新增要平行執行的任務

說明

public GearmanClient::addTask(
    字串 $function_name,
    字串|整數|浮點數 $workload,
    混合 $context = null,
    ?字串 $unique_key = null
): GearmanTask|false

加入一個與其他任務並行執行的任務。針對所有要並行執行的任務呼叫此方法,然後呼叫 GearmanClient::runTasks() 來執行工作。請注意,需要有足夠的 worker 可用,才能讓所有任務並行執行。

參數

function_name

worker 要執行的已註冊函式

workload

要處理的序列化資料

context

要與任務關聯的應用程式上下文

unique_key

用於識別特定任務的唯一 ID

回傳值

一個 GearmanTask 物件,如果無法加入任務,則為 false

範例

範例 #1 提交兩個任務的基本範例

<?php

// 建立 Gearman 用戶端
$gmclient= new GearmanClient();

// 加入預設的工作伺服器
$gmclient->addServer();

// 設定工作完成時要呼叫的函式
$gmclient->setCompleteCallback("complete");

// 加入一個任務,對字串 "Hello World!" 執行 "reverse" 函式
$gmclient->addTask("reverse", "Hello World!", null, "1");

// 加入另一個任務,對字串 "!dlroW olleH" 執行 "reverse" 函式
$gmclient->addTask("reverse", "!dlroW olleH", null, "2");

// 執行任務
$gmclient->runTasks();

function
complete($task)
{
print
"完成: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

上述範例的輸出會類似如下:

COMPLETE: 2, Hello World!
COMPLETE: 1, !dlroW olleH

範例 #2 基本提交兩個任務並傳遞應用程式上下文

<?php

$client
= new GearmanClient();
$client->addServer();

# 設定工作完成時要呼叫的函式
$client->setCompleteCallback("reverse_complete");

# 新增一些任務,並預留放置結果的位置
$results = array();
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# 回呼函式應已填入結果
foreach ($results as $id => $result)
echo
$id . ": " . $result['handle'] . ", " . $result['data'] . "\n";


function
reverse_complete($task, $results)
{
$results[$task->unique()] = array("handle"=>$task->jobHandle(), "data"=>$task->data());
}

?>

上述範例的輸出會類似如下:

t2: H.foo:21, Hello World!
t1: H:foo:22, !dlroW olleH

另請參閱

新增筆記

使用者貢獻的筆記 3 則筆記

liv_romania at yahoo dot com
9 年前
在 PHP 5.5 中,您可以使用以下程式碼透過引用傳遞上下文,並避免「呼叫時傳遞引用已被移除」的錯誤訊息。

<?php
$client
= new GearmanClient();
$client->addServer();

# 設定工作完成時要呼叫的函式
$client->setCompleteCallback("reverse_complete");

# 使用 StdClass 取代陣列
$results = new StdClass();
$results->value = array();

# 新增一些任務作為放置結果的佔位符
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# 現在應該從回呼函式中填入結果
foreach ($results->value as $id => $result) {
echo
$id . ": " . $result['handle'] . ", " . $result['data'] . "\n";
}

function
reverse_complete(GearmanTask $task, StdClass $results)
{
$results->value[$task->unique()] = array(
"handle" => $task->jobHandle(),
"data" => $task->data()
);
}
?>
stanislav dot reshetnev at gmail dot com
10 年前
請注意,如果您想要分別執行多個任務,那麼參數 $unique 必須在每個任務中設定不同的值。如果多個任務的 $unique 參數相同,您將會得到相同的任務。

<?php
$unique
=1;

$gclient = new GearmanClient();
$gclient->addServer('srv');

$this->setCreatedCallback(function(GearmanTask $task) {
echo
$task->jobHandle() . "\n";
});

$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->addTask('function_name', 'workload', null, $unique);
$gclient->runTasks();

sleep(5);
?>

這段程式碼只會印出一個處理器

H:srv:377382343
H:srv:377382343
H:srv:377382343
Jeremy Zerr
11 年前
從 PHP 5.3.0 開始,當您在 $client->addTask(..., ..., &$results, ...); 中使用 & 時,您會收到一個警告,指出「呼叫時傳遞參考」已被棄用。而從 PHP 5.4.0 開始,呼叫時傳遞參考已被移除,因此使用它會引發致命錯誤。

這表示當您像上面範例一樣使用 context 參數呼叫 addTask 時:

<?php
# 新增一些任務作為放置結果的佔位符
$results = array();
$client->addTask("reverse", "Hello World!", &$results, "t1");
?>

您會收到這個「呼叫時傳遞參考」警告(或錯誤)。可以透過將 context 變數更改為物件,使其以參考方式傳遞,來避免這個問題,同時仍然保持程式碼的功能,如下所示:

<?php
$results
= new \stdClass();
$client->addTask("reverse", "Hello World!", $results, "t1");
?>

為了完整性,請將 complete handler 修改為預期接收一個參考。

<?php
function reverse_complete($task, &$results) { ... }
?>

然後,在 complete handler 內部,您可以使用 $results 物件來儲存您的結果,以便在 complete handler 外部存取。
To Top