我有一个具有用户之间消息传递功能的网站。当用户登录时,我使用jQuery.ajax()
调用 PHP 脚本来检查新消息。为了减少请求,我的 PHP 脚本循环调用该check_new_messages()
函数,如果没有新消息,我sleep(5)
在循环内部调用,以便它等待 5 秒然后继续循环。我通过使用检查脚本执行了多长时间microtime()
,如果超过 60 秒,我返回 0。ajax 将接收此值,然后再次调用脚本。
function check_message_queue($user) {
$response = 0;
$msgs = 0;
$time_start = microtime(true);
while (!$msgs = check_new_messages($user)) {
sleep(5);
$time_end = microtime(true);
if ($time_end - $time_start >= 60)
return $response;
}
// has new messages
sleep(5);
return $response;
}
我的 php.ini 已max_execution_time
设置为 120。
起初一切正常,但是当我刷新页面时会有大约 10 秒的延迟,有时我会收到 PHP 错误“已超过 30 秒的最大执行时间”,然后是 Apache 崩溃。我的 PHP max_execution_time 绝对设置为 120 秒,所以我不确定发生了什么。
我以前从来没有做过这样的事情,所以希望这只是我的一些糟糕的编码。
这是我的 JavaScript:
var request_new_messages = function() {
$.ajax({
url: 'messages/checkqueue',
type: 'post',
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
data: { id: 0 },
complete: function() { request_new_messages(); },
error: function(jqXHR, textStatus, errorThrown) { handle_error(); },
success:
function(data, textStatus, jqXHR) {
if (textStatus == "success") {
if (!isNaN(data)) {
var response = parseInt(data);
if (response > 0)
alert('You have ' + response + ' new messages.');
}
}
}
});
};