2012-10-24 36 views
0

人們開始抱怨我的網站速度,它很慢。我需要你的幫助來確定問題。在一個更好的解決方案後,我一直在尋找互聯網像瘋了一樣,但沒有成功。我正在試圖從justin.tv/twitch獲取流媒體名稱和流式播放器的訪問人數。json justin慢

當前我正在使用自己的API維基頁面中的入門代碼。然而,它非常緩慢。我有52個流存儲在mySQL數據庫中,我將其放入數組中,然後使用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 />"; 
} 
?> 

更新。是的,我使用我的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>"; 
+0

如果您需要從數據庫中提取所有記錄來完成您的工作,您首先需要的是DB?把這些數據放在代碼中 –

+0

你的代碼對我來說看起來非常簡潔,你已經用逗號分開了,而不是52個API調用,只做了1次API調用。你只需要分析你的代碼,看看它的緩慢部分是什麼,如果它的API調用沒有多少你可以做的;最好的辦法就是緩存API調用的結果,並在CURL調用中設置一個超時,如果CURL調用需要更長的時間,那麼X的秒數就會超時,您可以使用緩存的結果來顯示。 –

+0

謝謝。我會研究這個。 – mpj

回答

0

最有可能的問題是,從投票的api.justin.tv數據需要相當長的(相對於其餘爲F代碼)。 http連接需要一些時間。 當數據被拉出時,沒有任何東西可以顯示,因此用戶會經歷很長的等待時間。

有幾種解決方案。每次用戶打開網站但不是定期加載api信息。您可以每5分鐘下載數據或使用cron作業每隔幾分鐘或幾秒(取決於值更改的速度)將其拖入後臺,並將數據存儲在數據庫表中。

如果數據存儲在服務器上(即使在慢速文件系統上),速度也會更快。

+0

嘿喬納斯。我在其他地方閱讀關於使用cron作業的短文,看起來很先進。我不知道從哪裏開始或在哪裏學習。但是,這可能是我能得到的最好答案,謝謝你們。 – mpj