Длинный опрос Ajax / PHP приводит к ошибке 503

To E спросил: 14 ноября 2017 в 06:24 в: php

Я играю с длинным опросом AJAX и пытаюсь прочитать / обновить значение простого счетчика (числа) в ячейке MySQL, нажав кнопку.

PHP создает бесконечный цикл while и проверяет, было ли изменено значение в соответствующей ячейке (MySQL"current_timestamp", UNIX). Если он есть и значение current_timestamp больше, чем отметка времени, когда был сделан вызов AJAX, он прерывает цикл и отправляет обновленное значение и обновленную current_timestamp клиенту. AJAX обрабатывает данные.

Проблема: Это работает, но через некоторое время я получаю 503 ошибку. Я предполагаю, что это, очевидно, цикл while или другие открытые соединения через несколько окон в других браузерах (для тестирования).

PHP-файл 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);

AJAX-часть в js-файле:

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 ответов