我正在尝试制作一个类似app的facebook网页信使,我在客户端使用AJAX,在服务器端使用php。
我的AJAX代码:
function longPoll(timestamp)
{
var queryString = {'timestamp' : timestamp};
var shouldDelay = false;
$.ajax(
{
type: 'GET',
async: true,
url: 'pollMsg.php',
data: queryString,
timeout: 5000,
cache: false
}
).done(function(data){
var array = jQuery.parseJSON(data);
for (var i = 0; i < array.length; i++) {
$('#msgTable > tbody:last-child').append('<tr><td><b>' + array[i].sender + '</b><br/>' + array[i].timestamp + '</td><td><b>' + array[i].title + '</b><br/>' + array[i].content + '</td></tr>');
}
longPoll(obj.timestamp);
}).fail(function(jqXHR, textStatus, errorThrown) {
//shouldDelay = textStatus !== "timeout";
}).always(function() {
var delay = shouldDelay ? 5000: 0;
if (shouldDelay) {
shouldDelay = false;
window.setTimeout(longPoll, delay);
}
});
}
// initialize jQuery
$(function() {
longPoll();
});
我的PHP代码:
//set php runtime to unlimited
set_time_limit(10);
while (true) {
$last_ajax_call = isset($_GET['timestamp']) ? (int)$_GET['timestamp'] : '1970-01-01 00:00:00';
$sql = "select * from post where (receiver = ? or sender = ?) and postat > str_to_date(?, '%Y/%m/%d %H:%i:%s')";
$stmt = $conn->prepare($sql);
$stmt->bind_param("sss", $username, $username, $last_ajax_call);
$result = $stmt->execute();
$rows = $stmt->get_result()->fetch_all();
if (count($rows) > 0) {
$result = array();
foreach ($rows as $row) {
$data = array (
'sender' => $row[3],
'timestamp' => $row[5],
'title' => $row[1],
'content' => $row[2]
);
array_push($result, $data);
}
$json = json_encode($result);
echo $json;
break;
} else {
sleep( 1 );
continue;
}
}
我发现如果我一次点击带有AJAX代码的页面,当我更改到同一个网络服务器中的其他页面时,我会得到一个nginx错误(因为我使用的是nginx)。
我的代码有什么问题?我找到了一些长轮询的例子,它给了我类似的代码。谢谢。
当我重新启动php-fpm时,一切正常,这意味着我已经生成了这么多请求,以至于服务器无法处理。