Я пытаюсь получить последние сообщения из таблицы MySQL, используя длинный опрос.
Здесь, если у меня нет новых сообщений, я делаю скрипт sleep()
на 10 секунд.
Но в худшем случае, если я не получаю новые сообщения для 10 минут сценарий скажет max_execution_time
превышены.
Как я это исправлю. Может кто-нибудь сказать, где я иду не так.
PS — Я не хочу использовать веб-сокеты сейчас, по крайней мере.
pullmessage.php
$notyetgot = true;
$data_msg = mysqli_query($con,"SELECT * FROM messages WHERE message_id>".$latest." ");
$n = mysqli_num_rows($data_msg);
if($n > 0){$notyetgot=false;}
while($notyetgot){
sleep(10);
$data_msg = mysqli_query($con,"SELECT * FROM messages WHERE message_id>".$latest." ");
$n = mysqli_num_rows($data_msg);
if($n > 0){$notyetgot = false;}
}
...
(Во-первых, я надеюсь, что я правильно понимаю цель вашего кода.)
PHP предназначен для выполнения по требованию. Приходит запрос, он что-то делает, а затем уходит. Вместо этого сидеть там в ожидании чего-то «неправильно».
Если, например, вы создаете функцию, аналогичную «недавним входящим сообщениям» от stackoverflow, это, вероятно, реализуется клиентским кодом Javascript, который является «сидя там в ожидании» (ожидая, пока пользователь закроет страницу).
Переполнение стека впечатляет тем, сколько информации он помещает на страницу, и делает это достаточно быстро. Многие сайты плохо работают на менее сложных страницах.
Вернуться к JS «решение». Код JS периодически отправляет запрос AJAX на страницу PHP (?) На каком-либо SO-сервере. PHP запустится, подключится к базе данных, получит запрошенный материал, отправит его обратно клиенту и умрет. Затем JS изменяет DOM, и poof, «Входящие» становится красным, а число увеличивается на 1.
Это много работы и много движущихся частей. Но я думаю, что инициирование задачи запускается на клиенте, а не на сервере.
Также обратите внимание, что после того, как PHP исчезнет, он не сможет повторно подключиться к веб-странице клиента. AJAX служит этой цели, но работает в «противоположном направлении».
В качестве альтернативы вы можете запустить скрипт из оболочки, где max_execution_time по умолчанию равно 0 (бесконечно).
php pullmessage.php