当客户端发送较大的有效负载

我有一个使用Gearman的问题,当我通过Gearman PHP扩展发送大型有效载荷时,将任务传输给工作人员的速度很慢。 事实上,我们没有发现有效载荷是那么大(30MB)。 一切(PHP,Gearman,节点)现在都在本地运行,所以networking访问不是瓶颈。

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工人,最终会做些什么,但是是空的,以certificate工人代码不是问题:

 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 (输出发送作业给Gearman之后 )30秒钟左右冻结,并通过输出string(7) "Toasty!" 通过PHP的var_dump。 所以它的工作,但它只需要处理。

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

我试图在PHP中编写相同的工作,结果相同:

 $worker= new GearmanWorker(); $worker->addServer('127.0.0.1', '4730'); $worker->addFunction("validateJsonSchema", "validateJsonSchema"); while ($worker->work()); function validateJsonSchema($job) { return 'ToastyPHP!'; } 

UPDATE

使用node.js客户端,做的事情几乎与PHP相同,它执行得更快(约3.5秒)。 我做错了PHP版本,或者我错过了一些configuration,使其更快?

我的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秒&#x3002;

    Interesting Posts