Максимальное время выполнения превышено при длительном опросе

Я пытаюсь получить последние сообщения из таблицы 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;}

}
...

2

Решение

(Во-первых, я надеюсь, что я правильно понимаю цель вашего кода.)

PHP предназначен для выполнения по требованию. Приходит запрос, он что-то делает, а затем уходит. Вместо этого сидеть там в ожидании чего-то «неправильно».

Если, например, вы создаете функцию, аналогичную «недавним входящим сообщениям» от stackoverflow, это, вероятно, реализуется клиентским кодом Javascript, который является «сидя там в ожидании» (ожидая, пока пользователь закроет страницу).

Переполнение стека впечатляет тем, сколько информации он помещает на страницу, и делает это достаточно быстро. Многие сайты плохо работают на менее сложных страницах.

Вернуться к JS «решение». Код JS периодически отправляет запрос AJAX на страницу PHP (?) На каком-либо SO-сервере. PHP запустится, подключится к базе данных, получит запрошенный материал, отправит его обратно клиенту и умрет. Затем JS изменяет DOM, и poof, «Входящие» становится красным, а число увеличивается на 1.

Это много работы и много движущихся частей. Но я думаю, что инициирование задачи запускается на клиенте, а не на сервере.

Также обратите внимание, что после того, как PHP исчезнет, ​​он не сможет повторно подключиться к веб-странице клиента. AJAX служит этой цели, но работает в «противоположном направлении».

1

Другие решения

В качестве альтернативы вы можете запустить скрипт из оболочки, где max_execution_time по умолчанию равно 0 (бесконечно).

php pullmessage.php
0

По вопросам рекламы [email protected]