我刚刚完成了这段代码,以获取有关游戏的一些信息。
<?php
$apik = 'API_KEY';
$versionurl = 'https://ddragon.leagueoflegends.com/realms/na.json';
function request($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$decode = json_decode($response);
return $decode;
}
function getChamps(){
$array = getChampsId();
$champsn = count($array['champs']);
$arrayb = array();
$i = 0;
do {
$arrayb[$i] = $array['champs'][$i]->id;
$i = $i+1;
} while ($i<=$champsn-1);
$i = 0;
do {
echo getChampsNames($arrayb[$i]);
$i = $i+1;
} while ($i<=$champsn-1);
}
function getChampsId() {
global $apik;
$url = 'https://euw.api.pvp.net/api/lol/euw/v1.2/champion?freeToPlay=true&api_key='.$apik;
$req = request($url);
$array = array();
$array['champs'] = $req->champions;
return $array;
}
function getChampsNames($id) {
global $apik;
$ver = getVers('champion');
$url = 'https://global.api.pvp.net/api/lol/static-data/euw/v1.2/champion/'.$id.'?locale=en_US&version='.$ver.'&champData=all&api_key='.$apik;
$req = request($url);
$array = array();
$array = $req->name;
return $array;
}
function getVers($obj){
$url = 'https://ddragon.leagueoflegends.com/realms/na.json';
$req = request($url);
$array = array();
$array = $req->n->$obj;
return $array;
}
?>
致电:
getChamps();
问题是该网站采取30/40(?)秒加载..为什么?我觉得卷发太多了?但我不知道有任何其他方法可以解决这个问题吗?
答案 0 :(得分:1)
要问自己一个重要的问题是“源材料多久发生变化?”根据这个游戏锦标赛的统计数据,我的赌注是每次加载数据时都不会改变。
CURL和fsockopen
(以及类似的所有内容)都是阻止请求。这意味着PHP将继续等待它们完成。更糟糕的是,这是网络通信,所以如果另一端很慢,则可能意味着您的页面超时等待。由于您的源可能不会每次都需要新的负载,我建议您将其移动到cron job并将结果解析为数据库或平面文件。然后从该源加载本地页面。这将消除阻塞问题造成问题的任何可能性,因为如果cron失败,它将在以后再次运行。
答案 1 :(得分:1)
在PHP中,cURL会阻塞,所以它必须等待每个cURL完成才能继续下一个cURL。这或许是PHP的短暂出现。如果浏览器请求此脚本,您可能最好在客户端写入并同时触发所有请求。
查看一些JavaScript框架,例如:
所有这些基本方法是创建callback
函数或promise
并将其提供给处理您的AJAX请求的事物。一旦请求返回,就会调用该函数(或者承诺是为了填充)。您可以使用它来更改页面的状态。
您可以同时触发多个请求,因此请不要忘记您的可能回调可能不会按照请求的顺序发生。 :)