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를 배우기 시작, 그래서 실수 나이 이상한 줄 초보자 몇 가지가있을 수 있습니다, 좋은 주시기 바랍니다. 코드 최적화에 대한 조언은 매우 감사드립니다!
당신의 getContent 함수는 ajax가 async이기 때문에 스스로를 호출하고 죽음의 무한 루프를 반복합니다. fyi : 실제로하는 일에 사용하기가 더 간편한 getJSON이라는 jQuery 메서드가 있습니다. 내가 알 수 있듯이 실시간 TCP 소켓을 시뮬레이션하려고합니다. WebSocket 프로토콜을 사용하고있는 Node.js와 socket.io를 보았습니까? –