我有这个PHP脚本,它通过API从游戏高分中检索信息。问题是,对于每个播放器,它需要大约半秒钟,并且用户数量继续加起来超过100,页面加载需要大约50秒,这是非常长的。有什么方法可以减少加载时间,或者我必须在检索数据后存储数据,并且每30分钟左右更新一次。
这是代码:
for ($i = 0; $i <= $totalMembers - 1; $i++) {
$currentLine = $lines[$i];
$Data = explode("\t", $currentLine);
$nameParsed = rawurlencode($Data[1]);
$c = curl_init('http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=' . $nameParsed);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_TIMEOUT, 0);
$html = curl_exec($c);
//$htmlTrimmed = trim($html);
$oneLine = trim(preg_replace("/[\n\r]/", ",", $html));
if (curl_error($c))
die(curl_error($c));
// Get the status code
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);
if ($status != 404){
$userInfo = explode(",", $oneLine);
$Base = 0.25 * ($userInfo[7] + $userInfo[13] + floor($userInfo[19]/2));
$Melee = 0.325 * ($userInfo[4] + $userInfo[10]);
$Range = 0.325 * (floor($userInfo[16]/2) + $userInfo[16]);
$Mage = 0.325 * (floor($userInfo[22]/2) + $userInfo[22]);
$classLevel2 = max($Melee, $Range, $Mage);
$Final = floor($Base + $classLevel2);
$totalCombat += $Final;
}
curl_close($c);
}
答案 0 :(得分:3)
您不应该依赖第三方网站来构建您自己的内容。如果您的服务器发出太多请求,它们甚至会阻止您;例如,当几个访问者在同一时间打开页面时。
相反,您应该安排后台作业(在Linux上使用cron或在Windows上使用任务调度程序)定期获取记录(或者只在可能的情况下仅更新记录)并在您自己的数据库中添加/替换这些记录。
然后,您可以从您自己的数据库中提供即时内容。而且您还可以控制对外部网站提出的请求数量,从而降低结束黑名单的风险。
答案 1 :(得分:-1)
您可以同时执行多个卷曲异步,请参阅http://php.net/manual/en/function.curl-multi-init.php。类似的东西:
<?php
function parseName($line) {
$data = explode("\t", $line);
return rawurlencode($data[1]);
}
function calculateScore($line) {
$userInfo = explode(",", $line);
$Base = 0.25 * ($userInfo[7] + $userInfo[13] + floor($userInfo[19]/2));
$Melee = 0.325 * ($userInfo[4] + $userInfo[10]);
$Range = 0.325 * (floor($userInfo[16]/2) + $userInfo[16]);
$Mage = 0.325 * (floor($userInfo[22]/2) + $userInfo[22]);
$classLevel2 = max($Melee, $Range, $Mage);
return floor($Base + $classLevel2);
}
$curls = array();
$mh = curl_multi_init();
for ($i = 0; $i < $totalMembers; $i++) {
$curls[$i] = curl_init('http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=' . parseName($lines[$i]));
curl_setopt($curls[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curls[$i], CURLOPT_TIMEOUT, 0);
curl_multi_add_handle($mh, $curls[$i]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($curls as $id => $c) {
$status = curl_multi_getinfo($c, CURLINFO_HTTP_CODE);
if ($status != 404){
$html = curl_multi_getcontent($c);
$oneLine = trim(preg_replace("/[\n\r]/", ",", $html));
$totalCombat += calcaulateScore($oneLine);
}
curl_multi_remove_handle($mh, $c);
}
curl_multi_close($mh);