gpt4 book ai didi

php - 客户端发送大负载时 Gearman 速度变慢

转载 作者:IT老高 更新时间:2023-10-28 22:04:54 27 4
gpt4 key购买 nike

我在使用 Gearman 时遇到问题,当我通过 Gearman PHP 扩展向它发送大量有效负载时,将任务传输给工作人员很慢。事实上,我们发现有效载荷并没有那么大(它是 30MB)。目前一切(PHP、Gearman、 Node )都在本地运行,因此网络访问不是瓶颈。

PHP 脚本

这里是 PHP 客户端:

ini_set('memory_limit', '1G');

$client= new GearmanClient();
$client->addServer('127.0.0.1', '4730');

$schema = file_get_contents('schema.json');
$data = file_get_contents('data.json');

$gearmanData = [
'schema' => $schema,
'data' => $data
];

echo "Encoding in JSON the payload\n";

$gearmanDataString = json_encode($gearmanData, JSON_FORCE_OBJECT);

echo "Sending job to Gearman\n";

// This line takes long to execute...
$result = $client->doNormal("validateJsonSchema", $gearmanDataString);

echo "Job finished\n";

var_dump($result);

这是我的 nodejs worker,它最终会做一些事情,但它是空的,以证明 worker 代码不是问题:

var gearmanode = require('gearmanode');

var worker = gearmanode.worker({host: '127.0.0.1' port: 4730});

worker.addFunction('validateJsonSchema', function (job) {
console.log('I will do something');

job.workComplete('Toasty!');
});

我在后台启动我的工作人员,然后运行我的客户端,它在执行 $client->doNormal 时卡住了 30 秒左右(就在输出 Sending job to Gearman),最后通过 PHP 的 var_dump 输出 string(7) "Toasty!"。所以它有效,但它的处理时间很长。

另外,如果我减小有效负载 (data.json) 的大小,所需的时间会更少,因此有效负载大小似乎很重要。

我尝试用 PHP 编写相同的 worker,结果相同:

$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', '4730');
$worker->addFunction("validateJsonSchema", "validateJsonSchema");
while ($worker->work());

function validateJsonSchema($job)
{
return 'ToastyPHP!';
}

更新

使用 node.js 客户端,做几乎与 PHP 相同的事情,它的执行速度要快得多(约 3.5 秒)。我是在 PHP 版本上做错了什么,还是缺少一些配置以使其更快?

我的 node.js 客户端:

var gearmanode = require('gearmanode');
var fs = require('fs');

var start = Date.now();

var client = gearmanode.client();

schema = fs.readFileSync('schema.json', 'utf8');
data = fs.readFileSync('data.json', 'utf8');

var submitData = JSON.stringify({ "data": data, "schema": schema });

// Runs much faster than PHP
var job = client.submitJob('validateJsonSchema', submitData, {background: false});

job.on('complete', function() {
console.log('RESULT >>> ' + job.response);
client.close();

var end = Date.now();

console.log(end-start + ' milliseconds'); // Always shows around 3500 milliseconds
});

任何线索为什么会发生这种情况? Gearman 是否可以处理这种大小的有效载荷? 30MB 在我的书中并不算大。

最佳答案

检查这段代码是否适合你,完成这项工作只花了很短的时间。

worker.php:

echo "Starting\n";
$gmworker = new GearmanWorker();

# Add default server (localhost).
$gmworker->addServer('127.0.0.1', '4730');
$gmworker->addFunction("jsonValid", "jsonValid");



print "Waiting for job...\n";
while ($gmworker->work()) {
if ($gmworker->returnCode() != GEARMAN_SUCCESS) {
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function jsonValid($job)
{
return 'ToastyPHP!';
}

Client.php

ini_set('memory_limit', '1G');

$client = new GearmanClient();
$client->addServer('127.0.0.1', '4730');
$client->setCompleteCallback("complete");
$time = time();

echo "<pre>Sending job..." . "\n";


$schema = file_get_contents('AllSets.json');
$data = file_get_contents('AllSets.json');


$gearmanData = Array(
'schema' => $schema,
'data' => $data
);

$gearmanDataString = json_encode($gearmanData, JSON_FORCE_OBJECT);

$client->addTask("jsonValid", $gearmanDataString, null, 'Json');
$client->runTasks();

echo "Job finished\n";

$endtime = time();
print "Completed in " . ($endtime - $time) . ' seconds' . "\n";

function complete($task)
{
print "Unique : " . $task->unique() . "\n";
print "Data : " . $task->data() . "\n";
}

我使用了 addTask 和 runTasks 方法而不是 doNormal。对于要发送的 json 数据,我使用了 http://mtgjson.com/ 中的 AllSets.json 文件大约 30Mb 大小(总负载),工作在 1 秒内完成,在尝试大约 200Mb 的文件后花了 4 秒。

关于php - 客户端发送大负载时 Gearman 速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31864198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com