请求Apache服务器聊天应用程序
我写为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更好。
谢谢!
无限循环从来不是一个好主意,因为它们会影响您的服务器资源。 JS最好给你的get_messages函数提供间歇轮询。使用超时并在显示消息的任何页面上嵌入脚本。
我同意你的意见。在任何语言中都不是好主意,因为有无限循环。您可以让AJAX发送请求到您的功能,它也将改善您的网页作品:) – 2012-01-17 23:00:06
@udjamaflip呃这是一个答案,其实问题是:“我应该使用无限循环还是应该避免建设?”。附:我没有看到你的评论,甚至你也不能声称是由行业最佳实践引发的想法。您可能会找到数以万计的开发人员提供相同的建议。 – travega 2012-01-19 01:55:15
我打算根据我所掌握的有限信息来回答,以尽可能最广泛的方式帮助您遵循行业标准。你不需要按照你现在的方式进行编码,因为它非常低效且非常危险。
这里是运行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还有很多扩展功能,如果这是你以后的工作,它可以作为支持用途的聊天媒介。
请问为什么你不使用JS或HTML刷新来更新聊天客户端而不是模拟长轮询?这不是批评,只是确保你已经考虑过所有的选择。 – udjamaflip 2012-01-16 21:54:59
我正在使用一个mootools JSON.Reuqest到我的服务器端php get_messages函数。 – user889349 2012-01-17 12:09:21
我建议你不要尝试从服务器端进行长轮询,而是使用JS来执行刷新。你喜欢这样回答吗? – udjamaflip 2012-01-18 20:40:06