0

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

这个问题是页面加载不快,事实上,有时 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.netwww.clgaming.net

提前感谢您的帮助!

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

4

3 回答 3

3

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

我不熟悉 own3d api,但在 Twitch 中,您可以发送您想要的所有用户 ID,它会在一个 http 请求中为您获取所有详细信息。

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

例子:

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

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

这样,您可以在一个 http 请求中获取所有用户的流。

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

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

哦,还有一件事。当你渲染你的网站时不要做这个流获取东西,我有所有这些流在 ajax 中获取东西,这样,我的页面将首先加载,然后它会在我的网站被渲染后开始执行 http 请求。

缓存 twitch 和 own3d 发送给您的响应也是一个好主意。这样,您就不会为访问您网站的每个用户获取 own3d 和 twitch 的数据。如果您有一些稳定的流量,这特别好。

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

于 2012-12-15T17:33:26.117 回答
0

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

于 2012-11-03T00:44:35.567 回答
0

我使用 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>
于 2013-09-30T07:20:12.857 回答