使用cron作业在本地存储大型API调用

时间:2014-05-02 20:51:57

标签: php api cron

我最近一直在为一个项目使用API​​,当用户在框中搜索他/她的名字时,它会带来他们面对的5个对手。我将API分别调用五次来检索数据,然后在下一页显示5个对手中的每一个。但是,这会导致页面加载时间很长(有时约为30秒)。我在某处看到cron作业可用于在本地存储数据,因此API调用不需要在页面加载时发生。现在我的问题是,有没有办法通过cron作业通过API提取所有用户的数据并将其存储在本地以供以后使用?唯一的问题是这个API适用于拥有超过3000万用户的英雄联盟。我无法理解需要多长时间才能获取所有这些用户的数据并经常刷新它。那么有没有办法使用cron作业或其他方法来让我的页面不需要半分钟加载?这些是阻止网站的API调用:

$i = 0;
foreach($enemyTeamIds as $enemyTeamId) {
$url="APILINK";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('auth: key'));
curl_setopt($ch, CURLOPT_URL,$url);
$json_array=curl_exec($ch);
$enemyIds[$i] = json_decode($json_array, true);
$i = $i + 1;
}

1 个答案:

答案 0 :(得分:0)

当您在循环中查询用户/团队时,首先检查您的数据库,并且仅在未找到团队的情况下查询API,然后存储该结果,以便保持团队更新,您可以在行中添加时间戳。该团队最后更新。最初,您需要进行大量的API调用,然后您需要更新与您的网站相关联的用户/团队。

下面是一些伪代码:

<?php 
$i = 0;
foreach($enemyTeamIds as $enemyTeamId){

    //query your own db for enemyTeamId
    $result = get_from_db($enemyTeamId);

    //already have team
    if(!empty($result)){

        //if result older then 1 day - update
        if($result['timestamp'] < (time() - 86400)){
            //re query API for updates
            $result = query_api_team($enemyTeamId);
            //update result in your db
            update_in_db($enemyTeamId, $result);
        }
    }
    //dont have team query API
    else{

        //query API
        $result = query_api_team($enemyTeamId);
        //store result in your db
        put_in_db($enemyTeamId, $result);
    }

    $enemyIds[$i] = json_decode($result, true);
    $i++;
}

function query_api_team($enemyTeamId){
    //query API
    $ch = curl_init();
    ...
    ...
    return $json_array;
}
?>

虽然你可以使用cron定期运行一个脚本来做一些内务处理来更新,删除旧的团队等。