我们有以下潜在的情况:
一个可以拥有1000多个用户的网络应用。
我们希望设置一个cronjob,通过外部服务API为所有1000多个用户提供一个cronjob调用(注意:每个用户都有自己的API凭据和外部API服务)!
这是一种明智的方法吗?
的信息:
可能的脚本:
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秒才能返回数据。
这是正确的方法吗?
有更好的方法吗?
非常感谢!
答案 0 :(得分:2)
如果你真的需要定期为每个用户进行API调用,我会以不同的方式进行设置:
lastUpdated
和isBeingProcessed
(或类似内容); lastUpdated
日期且未处理的XX(10?)记录并设置isBeingProcessed
标记; lastUpdated
日期或时间的用户信息,并取消设置isBeingProcessed
标记; 根据您的服务器可以处理的内容以及API允许的内容,您甚至可以将其设置为同时运行多个作业/重叠,从而减少更新大量的总时间。