1000个API调用,1个cron作业?

时间:2014-02-09 16:03:32

标签: php mysql api curl cron

我们有以下潜在的情况:

一个可以拥有1000多个用户的网络应用。

我们希望设置一个cronjob,通过外部服务API为所有1000多个用户提供一个cronjob调用(注意:每个用户都有自己的API凭据和外部API服务)!

这是一种明智的方法吗?

的信息:

  • 使用凭据进行一次API调用最多可能需要5(!)秒才能恢复数据。

可能的脚本:

Cronjob调用一个本地php脚本(cronjobcall.php),它遍历所有1000个用户。对于每个用户,此脚本通过curl(localfile_calls_api.php)调用另一个本地脚本,该脚本进行实际的API调用并将返回的数据保存到MySQL数据库中。

cronjobcall.php

foreach($ThousandsOfUsers as $UserId => $UserCredentials)
{

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "localfile_calls_api.php?UserId=$UserId&UserCredentials=$UserCredentials");
curl_setopt($ch, CURLOPT_HEADER, 0);
$result=curl_exec($ch);

}

localfile_calls_api.php

// !!! this could take up to 5(!) seconds to return result

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://external_api_url.php?UserId=$UserId&UserCredentials=$UserCredentials");
curl_setopt($ch, CURLOPT_HEADER, 0);
$result=curl_exec($ch);

if($result)
{
save_to_MySql($result,$UserId);
}

所以,这就是为什么我想把整个过程分成两个不同的php文件,因为API调用本身可能需要5秒才能返回数据。

这是正确的方法吗?

有更好的方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

如果你真的需要定期为每个用户进行API调用,我会以不同的方式进行设置:

  • 在表格中添加两列:lastUpdatedisBeingProcessed(或类似内容);
  • 使用cron创建一个每隔X(1?)分钟运行一次的脚本;
  • 在您的脚本中,获取带有最早lastUpdated日期且未处理的XX(10?)记录并设置isBeingProcessed标记;
  • 每次API调用完成后,请更新包含lastUpdated日期或时间的用户信息,并取消设置isBeingProcessed标记;

根据您的服务器可以处理的内容以及API允许的内容,您甚至可以将其设置为同时运行多个作业/重叠,从而减少更新大量的总时间。