PHP长轮询使我的服务器挂起

时间:2016-11-08 09:23:44

标签: php jquery ajax nginx

我正在尝试制作一个类似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时,一切正常,这意味着我已经生成了这么多请求,以至于服务器无法处理。

0 个答案:

没有答案