减少PHP执行时间

时间:2015-05-29 17:00:35

标签: php html

我有这个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);
    }

2 个答案:

答案 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);