【问题标题】:json justin slowjson贾斯汀慢
【发布时间】:2012-10-14 22:22:23
【问题描述】:

人们开始抱怨我的网站速度太慢了。我需要你的帮助来确定问题。在找到更好的解决方案后,我一直在疯狂地搜索互联网,但没有成功。我正在尝试从 justin.tv/twitch 获取流名称以及流媒体有多少访问者。

目前我正在使用他们自己的 API wiki 页面中的入门代码。然而,它非常缓慢。我的 mySQL 数据库中存储了 52 个流,我将它们放入一个数组中,然后使用 json 解析数据。

<?php
$result = mysql_query("SELECT streamname FROM streams") or die(mysql_error());

$ids=array(); 
while($row = mysql_fetch_assoc($result))  
{
    $ids[]=$row["streamname"]; 
}

$stream_list = implode(",", $ids);
$mycurl = curl_init();

curl_setopt ($mycurl, CURLOPT_HEADER, 0);
curl_setopt ($mycurl, CURLOPT_RETURNTRANSFER, 1); 

//Build the URL 
$url = "http://api.justin.tv/api/stream/list.json?channel=" . $stream_list; 
curl_setopt ($mycurl, CURLOPT_URL, $url);

$web_response =  curl_exec($mycurl);
$results = json_decode($web_response); 
foreach($results as $s) 
{   
 echo "<a href='stream.php?watch=" . $s->channel->login . "'>" . $s->channel->login . " " . $s->channel_count . " viewers</a><br />";
}
?>

UPDATE. 是的,我使用我的 MySQL 设置每个频道的类别类型。我也试过没有这个,速度差异不是很大。所以它仍然是需要时间加载的json。这是我使用 MySQL 的方法

   $result = mysql_query("SELECT streamname FROM streams WHERE race = 'terran' OR race = 'protoss' OR race = 'zerg'") or die(mysql_error());

$ids=array(); 
while($row = mysql_fetch_assoc($result))  
{
    $ids[]=$row["streamname"]; 
}

$stream_list = implode(",", $ids);
$mycurl = curl_init();

curl_setopt ($mycurl, CURLOPT_HEADER, 0);
curl_setopt ($mycurl, CURLOPT_RETURNTRANSFER, 1); 

//Build the URL 
$url = "http://api.justin.tv/api/stream/list.json?channel=" . $stream_list; 
curl_setopt ($mycurl, CURLOPT_URL, $url);

$web_response =  curl_exec($mycurl);
$results = json_decode($web_response); 
echo "<div id=\"tab1\">";
foreach($results as $s) 
{
    // get race
    $sql = mysql_query("SELECT race, streamname, name FROM streams WHERE streamname = '" . $s->channel->login . "'") or die(mysql_error());

    $row = mysql_fetch_array($sql, MYSQL_BOTH);
    $race = $row['race']; // race
    $streamername = $row['name'];

    echo "race: " . $race . " <a href='stream.php?watch=" . $s->channel->login . "'>" . $row['name'] . " " . $s->channel_count . " viewers</a><br />";

}
echo "</div>";

【问题讨论】:

  • 如果您需要从数据库中提取所有记录来完成您的工作,您首先需要数据库做什么?将该数据放入代码中
  • 您的代码在我看来非常精简,您已经只进行了 1 个 API 调用,通道以逗号分隔,而不是 52 个 API 调用。您只需要分析您的代码并查看它的缓慢部分,如果它是 API 调用,那么您无能为力;你最好的办法是缓存 API 调用的结果并在你的 CURL 调用上设置一个超时,如果你的 CURL 调用需要更长的时间,那么它就会超时,你可以使用缓存的结果来显示。跨度>
  • 谢谢。我会调查一下。

标签: php json justin.tv


【解决方案1】:

最有可能的问题是,从 api.justin.tv 轮询数据需要很长时间(与您的代码的其余部分相比)。 http 连接需要一些时间。 在提取数据时,无法显示任何内容,因此用户等待时间很长。

有几种解决方案。您不应该在每次用户打开网站时加载 api 信息,而是定期加载。您可以每 5 分钟下载一次数据,也可以每隔几分钟或几秒钟使用 cron 作业将其拉入后台(取决于值的变化速度)并将数据存储在数据库表中。

如果数据存储在您的服务器上(即使在慢速文件系统上),速度会快得多。

【讨论】:

  • 嗨乔纳斯。我正在阅读有关在其他地方使用 cron 作业的简短内容,它似乎非常先进。我不知道从哪里开始或从哪里学习。但这可能是我能得到的最好答案,谢谢大家。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多