Вопрос вроде говорит все - есть ли функция, которая выполняет ту же функцию, что и функция JavaScript setTimeout() для PHP? Я искал php.net, и я не могу найти ничего...
Есть ли функция, аналогичная функции setTimeout() (JavaScript) для PHP?
Ответ 1
Невозможно отложить выполнение части кода в текущем script. Это также не имеет большого смысла, поскольку обработка PHP скрипт происходит полностью на стороне сервера, и вы просто задержите общее выполнение script. Существует sleep()
, но это просто остановит процесс в течение определенного времени.
Вы можете, конечно, запланировать PHP script для запуска в определенное время с использованием заданий cron и т.п.
Ответ 2
PHP не управляется событиями, поэтому setTimeout не имеет большого смысла. Вы наверняка имитируете его, и на самом деле кто-то написал Timer class, который вы могли бы использовать. Но я буду осторожен, прежде чем вы начнете программировать таким образом на стороне сервера в PHP.
Ответ 3
Здесь функция sleep
, которая приостанавливает script в течение определенного времени.
См. также usleep
, time_nanosleep
и time_sleep_until
.
Ответ 4
Не совсем, но вы можете попробовать функцию подсчета количества часов.
Ответ 5
Несколько вещей, которые я хотел бы отметить о таймерах в PHP:
1) Таймеры в PHP имеют смысл при использовании в длинных сценариях (демоны и, возможно, скрипты CLI). Поэтому, если вы не разрабатываете такое приложение, вам не нужны таймеры.
2) Таймеры могут блокироваться и не блокироваться. Если вы используете sleep()
, тогда это таймер блокировки, потому что ваш script просто зависает в течение определенного времени.
Для многих задач блокировка таймеров в порядке. Например, отправка статистики каждые 10 секунд. Это нормально, чтобы заблокировать script:
while (true) {
sendStat();
sleep(10);
}
3) Неблокирующие таймеры имеют смысл только в приложениях, управляемых событиями, например websocket-server. В таких приложениях событие может происходить в любое время (например, входящее соединение), поэтому вы не должны блокировать свое приложение с помощью sleep()
(очевидно).
Для этого существуют библиотеки циклов событий, такие как reactphp/event-loop, что позволяет обрабатывать несколько потоков неблокирующим образом, а также таймер/интервал.
4) Возможны неблокирующие таймауты в PHP.
Он может быть реализован с помощью функции stream_select()
с параметром тайм-аута (см., Как он реализован в responsephp/event-loop StreamSelectLoop:: run()).
5) Существуют расширения PHP, такие как libevent
, libev
, event
, которые позволяют выполнять таймеры (если вы хотите перейти на хардкор)
Ответ 6
Если вы не использовали AJAX для запросов live
, PHP не был бы предпочтительным языком для этой проблемы. Сценарии PHP не hang
и ждут другого ответа. Они не настойчивы. Javascript потребуется.
Даже для розыгрыша, функция javascript AJAX в паре с PHP script для синтаксического анализа и ответа соответственно будет именно тем, что вам нужно. Вы даже можете связать это с функцией sleep
в php, чтобы сделать ее более реалистичной. Кроме того, я подготовил кучу разных операторов для анализа на сервере, вы могли бы установить размер sleep
, необходимый для каждого оператора. Например:
MYSQL DATABASE EXAMPLE:
| 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
Ответ 7
если вам нужно выполнить действие после выполнения некоторого php-кода, вы можете сделать это с помощью эха
echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";
поэтому через некоторое время в клиенте (браузере) вы можете сделать что-то еще, например, перенаправить на другой php script или эхо-предупреждение
Ответ 8
http://php.net/manual/en/class.evtimer.php - это то, что вы ищете, вы можете иметь функцию, называемую в течение заданных интервалов, аналогичную setInterval в javascript. это расширение pecl, если у вас есть whm/cpanel, вы можете легко установить его через страницу установщика программного обеспечения/расширения.
Я не заметил, что этот вопрос связан с 2010 годом, и класс evtimer начал кодироваться в 2012-2013 годах. так как обновление старого вопроса, теперь есть класс, который может сделать это аналогично javascripts settimeout/setinterval.