Интересует вопрос - как правильно остановить цикл while во сне. Тот факт, что я внедрил «длинный опрос», чтобы быстро обновлять информацию на сайте (предупреждение, другая информация).Остановка цикла while php
СУТЬ SCRIPT
1. Мы будем посылать GET-запрос на PHP-страницу, в которой скрипт находится.
2. Сценарий запускает цикл , а.
3. В этой серии там условия и сна (1) в конце, который приостанавливает выполнение цикла.
- если цикл работает более секунд - остановить выполнение цикла, соответственно, и сценарий.
- Если на вашем сайте есть новая информация, скажите «alert» - выведите результаты для пользователя и остановите цикл.
ПРОБЛЕМА Если пользователь закрывает окно браузера, или перезагружает страницу - новый запрос выполняется по сценарию, который начнется цикл снова. Но в этом случае предыдущее выполнение цикла в то время как не остановится, пока в нем не будет работать хотя бы одно условие. Если пользователь отправляет много запросов на страницу - память сервера начинает загружаться, и в результате все висит до тех пор, пока все пока не остановят выполнение.
ВОПРОС Как остановить цикл и сценарий в целом, при запуске перезагрузке страницы или клиент? Пока я делал следующее. Когда вы запускаете сценарий, который мы генерируем, получаем случайное число, присвоенное переменной, и то же самое с сеансом. Дальше внутри страны, выполняя условие, в котором переменная должна быть значением сеанса. Если false - остановите цикл. Если мы запустим скрипт на новом - значение изменений сеанса и, соответственно, вся предыдущая производительность при остановке. Могу ли я использовать эту опцию? И насколько это безопасно?
update.php
// Initialize the user's session
$session = Session::instance();
$rand = rand();
$session->set('user_update_key', $rand);
$key = $rand;
$limit = 20;
$seconds = 0;
set_time_limit($limit + 1);
while (TRUE) {
if (Session::instance()->get('user_update_key') == $key) {
if (there are updates. if there is - output) {
echo 'update information';
flush();
exit;
}
if ($seconds == $limit) { // complete the loop at the expiration of the time.
echo 'Close';
flush();
exit;
}
$seconds++;
} else {
unset($session, $rand, $key, $notice, $mysession, $last_notice, $limit, $notise_return, $seconds);
flush();
exit;
}
session_write_close();
sleep(1);
session_start();
}
'while (TRUE)' <- Уверен, что вам это не нужно, не так ли? –
Вы можете использовать continue; ключевое слово для завершения цикла цикла. – Ali
Вам действительно нужно session_write_close();/session_start(); ? Как инициируется процесс обновления, можно ли просто установить тайм-аут в 30 секунд? – Adder