我第一次尝试使用长时间轮询来实时更新我的用户消息列表,websocket对我来说似乎太复杂了。我的应用程序现在在本地运行。
这是PHP代码,尚不完整,到目前为止,我只是在进行测试:
ini_set('max_execution_time', 0);
ignore_user_abort(false);
$isUptodate = (bool) file_get_contents($this->uptodateFile);
while ($isUptodate === true)
{
sleep(1);
$isUptodate = (bool) file_get_contents($this->uptodateFile);
}
$updateUptodateFile = fopen($this->uptodateFile, 'w');
fwrite($updateUptodateFile, 'true');
$jsonData = json_decode(file_get_contents($this->updateFile), true);
echo json_encode(['updates' => count($jsonData)]);
这是JS代码(同样,这些都是尝试,当代码运行正常时,setTimeout延迟将在以后更改):
checkForUpdates: function ()
{
var that = this;
$.ajax({
url: 'updates.php',
type: 'GET',
dataType: 'json',
timeout: 10000
}).done(function (data)
{
console.log('data received');
if (data.updates)
{
alert('nouveau message');
setTimeout(function () { that.checkForUpdates() }, 5000);
}
}).fail(function (data)
{
console.log(data);
setTimeout(function () { that.checkForUpdates() }, 10000);
});
}
所以,首先奇怪的是,如果我在ajax参数中设置async: true, cache: false
,则代码将无法正确加载我的updates.php文件。
第二件令我感到奇怪的事情是,如果我的循环运行一定时间,则我的会话将被破坏。
为什么?关于长时间轮询,我这样做对吗?