2017-12-08 14 views
0

AJAX long-polling을 사용 중이며 버튼을 클릭하여 MySQL 셀의 간단한 카운터 (숫자) 값을 읽거나 업데이트하려고합니다.Ajax/PHP long-polling 결과가 503 오류가 발생했습니다.

PHP는 무한 루프를 생성하고 해당 셀의 값이 수정되었는지 여부를 확인합니다 (MySQL "current_timestamp", UNIX). 그것이 있고 current_timestamp 값이 AJAX 호출이 만들어진 타임 스탬프보다 크면 루프를 깨고 업데이트 된 값과 업데이트 된 current_timestamp를 클라이언트에 보냅니다. AJAX는 데이터를 처리합니다.

문제 : 작동하지만 잠시 후 503 오류이 표시됩니다. 난 분명히 while 루프 또는 다른 브라우저 (테스트 용)의 여러 창을 통해 열려있는 연결 것 같아요.

PHP-파일 text.php : JS-파일에

// 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 부 :

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 오류입니다 10 분 후에 다시 작동합니다.

(오타/포맷 코드를 청소의 원인 일 수 있습니다.) 난 그냥 PHP와 JS를 배우기 시작, 그래서 실수 나이 이상한 줄 초보자 몇 가지가있을 수 있습니다, 좋은 주시기 바랍니다. 코드 최적화에 대한 조언은 매우 감사드립니다!

+0

당신의 getContent 함수는 ajax가 async이기 때문에 스스로를 호출하고 죽음의 무한 루프를 반복합니다. fyi : 실제로하는 일에 사용하기가 더 간편한 getJSON이라는 jQuery 메서드가 있습니다. 내가 알 수 있듯이 실시간 TCP 소켓을 시뮬레이션하려고합니다. WebSocket 프로토콜을 사용하고있는 Node.js와 socket.io를 보았습니까? –

답변

0

PHP가 사용자의 생각대로 작동하지 않기 때문에 PHP가 작동하지 않습니다.

의도적으로 PHP에 무한 루프를 넣으면 코드가 반복되어 각 루프에서 다음 GET 요청을 다시 확인하게됩니다.

현실은 코드가 각 요청마다 한 번 실행되며 코드 실행이 완료 될 때까지 서버가 응답하지 않는다는 것입니다.

AJAX long polling은 PHP에서 특별한 처리가 필요하지 않습니다. 이것은 AJAX 요청 일뿐입니다. 약간의 지연을 AJAX 코드에 포함 시키면 서버가 요청에 부딪히게됩니다.

이 긴 폴링 그것의 생각은 읽지 않은 메시지 알림 등

당신이 버튼 클릭과 같은 사용자 이벤트를 모니터링 할 경우를 표시하는 사용자 상호 작용없이 페이지를 업데이트하는 것입니다,위한 것이 아닙니다 정직하게하려면 AJAX 함수를 버튼 클릭에 바인딩하십시오.