异步处理信息的最佳语言

时间:2011-01-05 15:23:32

标签: thread-safety php asynchronous

在深入研究问题的核心之前,我首先要概述当前的情况。我目前有一个php脚本,通过CLI执行处理一些数据。它是这样的:

  • 用户通过网站提交一些数据,并将其存储在数据库中
  • 通过CLI执行的php脚本每5分钟左右循环一次数据库中的所有数据。它读取用户在数据库中提交的信息,处理它,然后在其他数据库中创建多个其他entires。通常它可能需要使用file_get_contents通过http发布内容。
    • 我不能总是在用户出于后勤原因提交信息时处理这些信息(这是不可协商的)

它的代码看起来像这样:

$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。

实际上,我会聘请程序员来解决这个问题。所以,我真的在寻找尽可能多的信息,以确定我应该在程序员中找到哪些技能。

此外,请不要建议获得更快的服务器。我专注于优化软件的最终结果。可以考虑改进软件方法所需的物理服务器的改进。但是,我试图避免简单地将资金注入硬件基础设施以补偿软件效率低下。

1 个答案:

答案 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 ...
}