2012-01-13 67 views
2

我寫爲Joomla(Apache服務器)聊天應用程序,並使用這種結構來模擬長輪詢(服務器端):請求Apache服務器聊天應用程序

function get_messages($last_id) { 
    $time = time(); 
    while((time() - $time) < 25) {  
     $sql = 'SELECT * FROM #__messages WHERE `id` >'.intval($last_id); 
     $db->setQuery($sql); 
     $rows = $db->loadAssocList(); 
     if (count($rows)>0) { 
     echo 'JSON STRING HERE'; 
     } else { 
    flush(); 
    } 
    usleep(5000000);  
    } 
} 

如何優化這一部分的代碼。 我應該使用無限循環還是應該在施工時避免? P/S:我知道Apache不是編寫聊天應用的最佳選擇,而node.js更好。

謝謝!

+0

請問爲什麼你不使用JS或HTML刷新來更新聊天客戶端而不是模擬長輪詢?這不是批評,只是確保你已經考慮過所有的選擇。 – udjamaflip 2012-01-16 21:54:59

+0

我正在使用一個mootools JSON.Reuqest到我的服務器端php get_messages函數。 – user889349 2012-01-17 12:09:21

+0

我建議你不要嘗試從服務器端進行長輪詢,而是使用JS來執行刷新。你喜歡這樣回答嗎? – udjamaflip 2012-01-18 20:40:06

回答

-1

無限循環從來不是一個好主意,因爲它們會影響您的服務器資源。 JS最好給你的get_messages函數提供間歇輪詢。使用超時並在顯示消息的任何頁面上嵌入腳本。

+0

我同意你的意見。在任何語言中都不是好主意,因爲有無限循環。您可以讓AJAX發送請求到您的功能,它也將改善您的網頁作品:) – 2012-01-17 23:00:06

+0

@udjamaflip呃這是一個答案,其實問題是:「我應該使用無限循環還是應該避免建設?」。附:我沒有看到你的評論,甚至你也不能聲稱是由行業最佳實踐引發的想法。您可能會找到數以萬計的開發人員提供相同的建議。 – travega 2012-01-19 01:55:15

-1

我打算根據我所掌握的有限信息來回答,以儘可能最廣泛的方式幫助您遵循行業標準。你不需要按照你現在的方式進行編碼,因爲它非常低效且非常危險。

這裏是運行intervaled投票所需的MooTools的代碼(我用MooTools的,你說你正在使用Joomla,我假設你使用1.6或更高版本1.5是EOL本月):

//this sets how often you want to update (in milliseconds). 
setInterval('chatPoll()',2000); 
//this function essentially just grabs the raw data 
//from the specified url and dumps it into the specified div 
function chatPoll() 
{ 
    var unixTimestamp Math.round(new Date().getTime()/1000) 
    var req = new Request({ 
     method: 'get', 
     url: $('ajax-alert').get('http://www.yoururltoupdate.com/file.php?last=' + (unixTimestamp-2), 
     data: { 'do' : '1' }, 
     onComplete: function(response) { response.inject($('my-chat-wrapper')); } 
    }).send(); 
} 

你的PHP文件看起來應該是這樣的:

get_messages($_GET['last']); 
function get_messages($last_id) { 

     $sql = 'SELECT * FROM #__messages WHERE `id` >'.intval($last_id); 
     $db->setQuery($sql); 
     $rows = $db->loadAssocList(); 
     if (count($rows)>0) { 
     echo json_encode($rows); 
     }  
} 

我還沒有完全測試此代碼,但它應該工作,如果沒有一定會幫助回答您的查詢至於如何你在做什麼試圖做到應該實現而不是你最初發布的方式。如果你真的想要花點心思,你也可以檢查node.js。 Joomla還有很多擴展功能,如果這是你以後的工作,它可以作爲支持用途的聊天媒介。