在深入研究问题的核心之前,我首先要概述当前的情况。我目前有一个php脚本,通过CLI执行处理一些数据。它是这样的:
它的代码看起来像这样:
$q = mysql_query("SELECT username, infoA, infoB FROM data");
while($r = mysql_fetch_array($q))
{
some_function($r['username'], $r['infoA']);
another_function($r['infoB']);
}
函数“some_function”和“another_function”是信息的所有实际处理发生的地方。这是一个问题:通常,有很多条目要循环,并且在第一个条目处理和最后一个条目之间存在太大的延迟。我需要在第一个和最后一个条目之间以最小延迟处理所有数据。功能本身已经过优化,运行速度非常快,因此不是问题。由于将来的函数调用不需要引用先前函数调用的数据,我认为我需要异步执行函数。这样,脚本可以循环到下一个条目,而无需等待第一个条目进行处理。
我创建的php cli脚本主要用于测试目的。它适用于初步测试,但一旦我启动,数据量将显着增加。处理诸如此类任务的理想语言是什么。我当然需要异步执行的函数。但是,如果同时有太多异步调用,则可能会使系统过载或信息无法正确处理。因此,还必须有一种有效的方法来处理这个问题。我仍然可以在PHP中执行此操作,还是应该转移到其他内容,为什么?
要求是我可以使用GET数据发出http请求(我不需要等待结果),能够使用mysql和memcached。
实际上,我会聘请程序员来解决这个问题。所以,我真的在寻找尽可能多的信息,以确定我应该在程序员中找到哪些技能。
此外,请不要建议获得更快的服务器。我专注于优化软件的最终结果。可以考虑改进软件方法所需的物理服务器的改进。但是,我试图避免简单地将资金注入硬件基础设施以补偿软件效率低下。
答案 0 :(得分:1)
我建议您立即使用Gearmand。
使用此扩展程序http://php.net/manual/fr/book.gearman.php
的PHP非常容易只需设置一个gearman服务器,然后重构代码,将所有处理委托给该服务器。
您之前的代码可以像这样重构:
<?php
# Client Code
$client= new GearmanClient();
$client->addServer();
print $client->doBackground("action1", json_encode(array($username, $infoA)));
print $client->doBackground("action2", $infoB);
# Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("action1", "some_function");
$worker->addFunction("action2", "another_function");
while ($worker->work());
function some_function($job)
{
list($username, $infoA) = json_decode($job->workload(), true);
// do the stuff ...
}
function another_function($job)
{
$infoB = $job->workload();
// do the stuff ...
}