网站加载缓慢与cURLs

时间:2015-04-15 12:00:23

标签: php curl

我刚刚完成了这段代码,以获取有关游戏的一些信息。

<?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(?)秒加载..为什么?我觉得卷发太多了?但我不知道有任何其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

要问自己一个重要的问题是“源材料多久发生变化?”根据这个游戏锦标赛的统计数据,我的赌注是每次加载数据时都不会改变。

CURL和fsockopen(以及类似的所有内容)都是阻止请求。这意味着PHP将继续等待它们完成。更糟糕的是,这是网络通信,所以如果另一端很慢,则可能意味着您的页面超时等待。由于您的源可能不会每次都需要新的负载,我建议您将其移动到cron job并将结果解析为数据库或平面文件。然后从该源加载本地页面。这将消除阻塞问题造成问题的任何可能性,因为如果cron失败,它将在以后再次运行。

答案 1 :(得分:1)

在PHP中,cURL会阻塞,所以它必须等待每个cURL完成才能继续下一个cURL。这或许是PHP的短暂出现。如果浏览器请求此脚本,您可能最好在客户端写入并同时触发所有请求。

查看一些JavaScript框架,例如:

  • jQuery - 它现在已经显示了它的年龄,但这几乎是JS Frameworks的大爸爸,也是学习时的好地方。
  • AngularJS - 这是一个完整的MVVM应用程序构建器。它采用了许多最新技术,具有现代,流行和强大的功能。如果你还没有完成MVVM(甚至是MVC),这可能是一个很大的范例转变,但值得学习。
  • ReactJS - 这是Facebook即将推出的框架。和Angular一样,它建立在编程理想的基础上,对于新来者来说可能很难,但同样值得学习。

所有这些基本方法是创建callback函数或promise并将其提供给处理您的AJAX请求的事物。一旦请求返回,就会调用该函数(或者承诺是为了填充)。您可以使用它来更改页面的状态。

您可以同时触发多个请求,因此请不要忘记您的可能回调可能不会按照请求的顺序发生。 :)