Вопрос вроде говорит все – есть ли функция, которая делает то же самое, что и функция JavaScript setTimeout () для PHP ? Я искал php.net , и я не могу найти никаких …
Невозможно отложить выполнение части кода в текущем скрипте. Это также не имеет большого смысла, поскольку обработка PHP-скрипта происходит полностью на стороне сервера, и вы просто задержите полное выполнение сценария. Существует sleep()
но это просто остановит процесс в течение определенного времени.
Разумеется, вы можете запланировать запуск PHP-скрипта в определенное время с использованием заданий cron и т.п.
PHP не управляется событиями, поэтому setTimeout не имеет большого смысла. Вы наверняка имитируете его, и на самом деле кто-то написал класс Timer, который вы могли бы использовать. Но я буду осторожен, прежде чем вы начнете программировать таким образом на стороне сервера в PHP.
Есть функция sleep
, которая приостанавливает скрипт на определенное количество времени.
См. Также usleep
, time_nanosleep
и time_sleep_until
.
Не совсем, но вы можете попробовать функцию подсчета количества .
Несколько вещей, которые я хотел бы отметить о таймерах в PHP:
1) Таймеры в PHP имеют смысл при использовании в длинных сценариях (демоны и, возможно, в сценариях CLI). Поэтому, если вы не разрабатываете такое приложение, вам не нужны таймеры .
2) Таймеры могут блокироваться и не блокироваться. Если вы используете sleep()
, то это таймер блокировки, потому что ваш скрипт просто зависает в течение определенного времени. Для многих задач блокировка таймеров в порядке. Например, отправка статистики каждые 10 секунд. Это нормально, чтобы заблокировать скрипт:
while (true) { sendStat(); sleep(10); }
3) Неблокирующие таймеры имеют смысл только в приложениях , управляемых событиями , например websocket-server. В таких приложениях событие может происходить в любое время (например, входящее соединение), поэтому вы не должны блокировать свое приложение sleep()
(очевидно). Для этого существуют библиотеки циклов событий , такие как reactphp / event-loop , которые позволяют обрабатывать несколько потоков неблокирующим образом, а также функцию таймера / интервала.
4) Неблокирующие таймауты в PHP возможны. Он может быть реализован с помощью функции stream_select()
с параметром тайм-аута (см., Как он реализован в реакцииphp / event-loop StreamSelectLoop :: run () ).
5) Существуют расширения PHP, такие как libevent
, libev
, event
которые позволяют выполнять таймеры (если вы хотите перейти на хардкор)
Если вы не используете AJAX для получения live
запросов, PHP не будет предпочтительным языком для этой проблемы. Сценарии PHP не hang
и ждут ответа. Они не настойчивы. Javascript потребуется.
Даже для подхалима функция javascript AJAX в сочетании с PHP-скриптом для синтаксического анализа ввода и ответа соответственно будет именно тем, что вам нужно. Вы даже можете связать это с функцией sleep
в php, чтобы сделать его более реалистичным. Кроме того, я бы подготовил кучу разных операторов для анализа на сервере, вы могли бы установить, сколько времени ожидания требуется для каждого оператора. Например:
Пример базы данных MYSQL:
| ID | SLEEP | STATEMENT | | 1 | 3 | Hello | | 2 | 10 | I have been alright, nothing new. | | 3 | 20 | This is a really long message that takes 20 seconds to type |
Поэтому вы можете разобрать его следующим образом:
$query = mysql_query("SELECT * FROM `responses` WHERE `id`='3'"); $array = mysql_fetch_array($query); sleep((int)$array['sleep']); //convert sleep time to integer, sleep. die($array['statement']); //print the statement back to AJAX function
если вам нужно выполнить действие после выполнения некоторого php-кода, вы можете сделать это с помощью эха
echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";
поэтому через некоторое время в клиенте (браузере) вы можете сделать что-то еще, например, перенаправить на другой php-скрипт или эхо-предупреждение
http://php.net/manual/en/class.evtimer.php , вероятно, то, что вы ищете, вы можете иметь функцию, называемую в течение заданных интервалов, аналогичную setInterval в javascript. это расширение pecl, если у вас есть whm / cpanel, вы можете легко установить его через страницу установки программного обеспечения / расширения.
я не заметил, что этот вопрос стоит с 2010 года, и класс evtimer стал кодироваться в 2012-2013 годах. так как обновление старого вопроса, теперь есть класс, который может сделать это аналогично javascripts settimeout / setinterval.