Max*_*eat 23 php gearman node.js
我有一个使用Gearman的问题,当我通过Gearman PHP扩展发送大量有效载荷时,将任务传输给工人的速度很慢.事实上,我们没有发现有效载荷那么大(它是30MB).一切(PHP,Gearman,节点)暂时在本地运行,因此网络访问不是瓶颈.
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);
Run Code Online (Sandbox Code Playgroud)
这是我的nodejs 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!');
});
Run Code Online (Sandbox Code Playgroud)
我在后台启动我的工作人员,然后运行我的客户端,并在执行时$client->doNormal(仅在将发送作业输出到Gearman之后)冻结30秒左右,并string(7) "Toasty!"通过PHP的var_dump 输出结束.所以它有效,但它的处理时间很长.
此外,如果我减小有效载荷的大小(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!';
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
使用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
});
Run Code Online (Sandbox Code Playgroud)
任何线索为什么会发生这种情况?Gearman是否能够处理这种有效载荷?在我的书中,30MB并不是那么大.
检查此代码是否适合您,只需很短的时间即可完成这项工作。
工人.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!';
}
Run Code Online (Sandbox Code Playgroud)
客户端.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";
}
Run Code Online (Sandbox Code Playgroud)
我使用了 addTask 和 runTasks 方法而不是 doNormal。对于要发送的 json 数据,我使用了http://mtgjson.com/中的 AllSets.json 文件,大小约为 30Mb(总负载),工作在 1 秒内完成,尝试处理大约 200Mb 的文件后,需要 4 秒。
| 归档时间: |
|
| 查看次数: |
1415 次 |
| 最近记录: |