我正在为twitch和own3dtv使用jsonapi,我的页面非常慢


I am using json api for twitch and own3d tv and my page is veeery slow

正如我在标题中所说,我正在通过php使用twitch-tv和own3d-tv的jsonapi来获取我想要的流的信息。

问题是页面加载不快,事实上,有时php服务器会因为30秒或更长时间的功能而停止。错误:致命错误:中超过了30秒的最长执行时间

我正在使用一个在线指示器:

 function status($stream_id, $type){
if($type == 't'){
    $chan = "http://api.justin.tv/api/stream/list.json?channel=" . $stream_id;
    $json = file_get_contents($chan);
    $exist = strpos($json, $stream_id);
    if($exist) {
        return true;
    }else{
        return false;   
    }

}else if($type == 'o'){
    $url = 'http://api.own3d.tv/liveCheck.php?live_id=' . $stream_id;
    $xml = simplexml_load_file($url);
    $isLive=$xml->liveEvent->isLive;
    if ($isLive == "true") {
        return true;
    }else{
        return false;   
    }
}
}

我正在使用一个从流中获取一些信息的函数:

function api_stream_data($stream_id, $type){
$stream_id = sanitize($stream_id);
$type = sanitize($type);
if($type == 't'){
    $streamData = json_decode(file_get_contents("http://api.justin.tv/api/stream/list.json?channel=$stream_id"),true);
    $data = array(
        'image'=>$streamData[0]['channel']['image_url_medium'],
        'title'=>$streamData[0]['title'],
        'limage'=>$streamData[0]['channel']['screen_cap_url_huge'],
        'game'=>$streamData[0]['meta_game']
    );
}else if($type == 'o'){
    $streamData = json_decode(file_get_contents("http://api.own3d.tv/rest/live/list.json?liveid=$stream_id"),true);
    $data = array(
        'image'=>$streamData[0]['thumbnail_small'],
        'title'=>$streamData[0]['live_name'],
        'limage'=>$streamData[0]['thumbnail_large'],
        'game'=>$streamData[0]['game_name']
    );
}
return $data;
}

所有功能都能完美工作,但问题是它们需要时间才能发挥作用。。。。

有什么可能更快地做到这一点的方法吗??我看到了一些其他网站的例子,加载速度非常快,比如www.solomid.net和www.clgaming.net。

提前感谢您的帮助!

编辑:*已解决*感谢大家的帮助!我使用了一个将数据存储到数据库的cronjob,然后我只进行了一个查询来请求它们,它每5分钟更新一次,但是,哦,好吧,总比什么都没有好。

您的代码很慢,因为每个用户只执行一个http请求。一个http请求通常需要大约200ms-400ms。PHP不是异步的,这意味着它将停止代码的执行,直到它从own3d或twitch得到响应。

我不熟悉own3dapi,但在Twitch中,你可以发送你想要的所有用户id,它会在一个http请求中为你获取所有细节。

这就是我在我的网站上获取twitchtv直播流的方式。

示例:

$response=$client->get('','','http://api.justin.tv/api/stream/list.json?channel='.inbulade(',',$users));

这将生成以下url:http://api.justin.tv/api/stream/list.json?channel=IPLLoL,tsm_theodone,KungenTV

通过这种方式,您可以在一个http请求中获取用户的所有流。

我建议,由于您已经确定了流属于哪个流提供程序,所以不要执行http请求,而是为每个流提供程序创建一个数组,并将流添加到相应的数组中。

最后,发出一个http请求,一个用于own3d数组中的所有流,另一个用于twitchtv数组中的全部流。现在,您的所有用户流只包含两个http请求。

哦,还有另外一件事。当你渲染你的网站时,不要做这种流获取的事情,我用ajax来获取所有这些流,这样,我的页面将首先加载,然后在我的网站渲染后开始执行http请求。

缓存twitch和own3d发送给您的响应也是一个好主意。这样你就不会为own3d获取数据,也不会对每个访问你网站的用户进行抽搐。如果你有一些稳定的交通,这是一个很好的选择。

这真的应该能提高速度。我希望这会有所帮助。

他们可能正在服务器上缓存API结果。这就是我对Honstreams.com所做的。服务器每分钟轮询API以获取新信息并存储这些信息,因此流的显示速度与网站的其他部分一样快。

我使用jQuery的ajax使请求异步:

<script>
$(document).ready(function() {
    $.ajax({
        url: 'your_php_which_do_the_request.php?stream=STREAMNAME',
        success: function(data) {
            if(data=="output of php") {
                // Stream is online
            } else {
                // Stream is offline
            }
        }
    });
});
</script>