Прежде всего, я хотел бы поблагодарить всех вас, великие люди, за то, что вы так помогаете новым программистам.
У меня вопрос по поводу длительного опроса. Я изучил несколько статей о технике длительного опроса программирования на кометах. Мне этот метод кажется очень сложным, потому что он также иногда требует установки некоторых скриптов на стороне сервера.
Теперь я нашел пример долгого опроса. Он отлично работает, но я не уверен, что это правильный метод. Пример сценария касается приложения, похожего на чат. Этот скрипт php работает следующим образом:
- Сценарий php постоянно проверяет файл data.txt, пока он не будет изменен.
- Как только data.txt изменяется, новый текст выводится на веб-страницу.
Вот скрипт php:
<?php
$filename = dirname(__FILE__).'/data.txt';
// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
file_put_contents($filename,$msg);
die();
}
// infinite loop until the data file is not modified
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
usleep(500000); // sleep 500ms to unload the CPU
clearstatcache();
$currentmodif = filemtime($filename);
}
// return a json array
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>
Я не включаю код веб-страницы, чтобы не усложнять вопрос. На веб-странице есть только div, который показывает текст data.txt всякий раз, когда он изменяется.
Основные моменты моего вопроса:
- Является ли этот метод цикла подходящим методом для длительного опроса сервера?
- Также, когда сервер выполняет
sleep();
, что произойдет с другими одновременными запросами? - Есть ли какой-нибудь способ уменьшить нагрузку на сервер из-за непрерывного скрипта длительного опроса?
- Если клиент, запускающий этот длинный запрос опроса, отключается, как мы можем узнать и соответствующим образом остановить сценарий для этого отключенного клиента?
Пожалуйста, помогите мне решить эту проблему ... Спасибо