我正在玩 AJAX长轮询并尝试通过点击按钮来读取/更新MySQL单元格中的简单计数器(数字)值。
PHP创建一个无限的while循环,并检查相应单元格中的值是否已被修改(MySQL" current_timestamp",UNIX)。如果它有,并且current_timestamp值大于AJAX调用的时间戳,它将打破循环并将更新的值和更新的current_timestamp发送到客户端。 AJAX处理数据。
问题:它有效但过了一会儿我得到 503错误。我猜它显然是在其他浏览器中通过多个窗口进行while循环或其他打开连接(用于测试)。
PHP-File text.php:
// Connect to database
$con = mysql_connect('XX', 'XX', 'XX');
if (!$con)
{
die('Error' . mysql_error());
}
mysql_select_db('X', $con);
// Get data
$query = mysqli_query("SELECT counter_value, last_modified FROM content WHERE X = 'X' ORDER BY X DESC");
// Start infinite loop
set_time_limit(0);
while (true)
{
// The timestamp of the last ajax call = the last modified timestamp
$last_ajax_call = $_GET['timestamp'];
clearstatcache();
// Get the value of the counter and the last modified timestamp
while($row = mysql_fetch_array($query))
{
$counter_value = $row['counter_value'];
$last_modified= strtotime($row['last_modified']);
}
// If the time of the last modified timestamp is bigger/later than the last ajax call
if ($last_modified > $last_ajax_call)
{
$result = array(
'counter_value' => $counter_value,
'timestamp' => $last_modified
);
$json = json_encode($result);
echo $json;
break;
// If not, try again in 3 seconds
} else
{
sleep(3);
continue;
}
}
// Close database
mysql_close($con);
js-File中的AJAX部分:
function getContent()
{
// get timestamp of last modified stored in attribute. The initial/first timestamp attribute is set beforehand.
var timestamp = $('#timestamp').attr('data-timestamp');
$.ajax(
{
type: 'GET',
url: 'test.php',
async: true,
cache: false,
data: {timestamp:timestamp},
success: function(data){
var obj = jQuery.parseJSON(data);
$("#counter").text(obj.counter_value);
$("#timestamp").attr("data-timestamp", obj.timestamp);
getContent();
}
}
);
}
getContent();
结果是一个503错误,在ca.之后消失了。 10分钟,它再次工作。
(任何拼写错误/格式化都可能是清理代码的结果。) 我刚开始学习PHP和JS,所以可能会有一些新手错误或奇怪的行,请你好。任何有关优化代码的建议都非常感谢!
答案 0 :(得分:0)
它死了,因为PHP不像你想象的那样工作。
你有意在你的php中加入一个无限循环,假设它会让你的代码继续循环并在每个循环中重新检查下一个GET
请求。
现实情况是,每个请求都会执行一次代码,直到代码执行完毕,服务器才会响应。
AJAX长轮询在php中不需要特殊处理,它只是一个循环中的AJAX请求。您可能希望在AJAX代码中稍微延迟,否则您的服务器将受到请求的影响。
说实话,这不是长轮询的目的,它的想法是在没有任何用户交互的情况下更新页面以显示未读消息通知等。
如果您想监控按钮点击等用户事件,请将AJAX功能绑定到单击按钮。