2010-08-08 3 views
20

Вопрос вроде говорит, что это все - есть функция, которая делает то же самое, как JavaScript функции SetTimeout() для PHP? Я искал php.net, и я не могу найти ни одного ...Есть функция, аналогичная функции setTimeout() (JavaScript) для PHP?

+0

@KennyTM - Почему это важно? ... – Alexander

+1

@ TheLife, чтобы люди могли найти реальное решение проблемы OP? :) –

ответ

8

Невозможно отложить выполнение части кода в текущем скрипте. Это также не имеет большого смысла, поскольку обработка PHP-скрипта происходит полностью на стороне сервера, и вы просто задержите полное выполнение сценария. Существует sleep(), но это просто остановит процесс в течение определенного времени.

Вы можете, конечно, запланировать PHP-скрипт для запуска в определенное время с использованием заданий cron и т.п.

+0

Немного сложно объяснить - я хотел был просто приостановить сценарий :) В основном, что я хочу сделать, это «подшутить» за одного из моих друзей. Я сделал ввод, в котором вы вводите свое имя, и когда вы отправляете чат, моделируется и делает его более реалистичным. Я хочу, чтобы сообщения от незнакомца, мой друг «разговаривает с», появлялись один за другим, если вы знаете что я имею в виду :) – Latze

+6

Временные события не имеют смысла, потому что скрипт работает на стороне сервера? Я не следую аргументам. Конечно, они менее полезны в PHP из-за отсутствия параллелизма, но есть ценность в том, что скрипт делает что-то через определенное количество времени или в определенный момент. – Artefacto

+2

@ Latze, похоже, что-то, что вы хотели бы сделать, используя JavaScript на стороне клиента, не так ли? –

9

Функция sleep, которая приостанавливает скрипт на определенное количество времени.

См. Также usleep, time_nanosleep и time_sleep_until.

+0

было бы неплохо смоделировать этот код в php: http://hastebin.com/rujakezuco.lisp. сон блокируется, тайм-ауты - нет. – Dmitry

10

PHP не управляется событиями, поэтому setTimeout не имеет большого смысла. Вы наверняка имитируете его, и на самом деле кто-то написал Timer class, который вы могли бы использовать. Но я буду осторожен, прежде чем вы начнете программировать таким образом на стороне сервера в PHP.

+1

Но у php есть инструменты, чтобы сделать ваш конкретный скрипт управляемым событием. например, запускать php через консоль, вы можете планировать несколько событий в разное время, на данный момент имеет смысл иметь тайм-ауты. – Dmitry

2

Если вы не использовали AJAX для получения live запросов, PHP не был бы предпочтительным языком для этой проблемы. Сценарии PHP не hang и ждут ответа. Они не настойчивы. Javascript потребуется.

Даже для розыгрыша javascript функция AJAX javascript, соединенная с PHP-скриптом для синтаксического анализа ввода и ответа, будет именно то, что вам нужно. Вы даже можете связать это с функцией sleep в php, чтобы сделать ее более реалистичной. Кроме того, я бы подготовил кучу разных операторов для синтаксического анализа сервера, вы могли бы установить размер sleep времени, необходимого для каждого оператора. Например:

MYSQL DATABASE Пример:

| 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 
1

, если вам нужно, чтобы сделать действие после того, как вы выполнить некоторый PHP код, который вы можете сделать это с эхом

echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>"; 

поэтому через некоторое время в клиенте (браузере) вы можете сделать что-то еще, например, перенаправление на другой php-скрипт, например, или эхо-предупреждение

1

http://php.net/manual/en/class.evtimer.php, вероятно, вы ищете функцию, называемую в течение заданных интервалов, аналогичную setInterval в javascript. это расширение pecl, если у вас есть whm/cpanel, вы можете легко установить его через страницу установки программного обеспечения/расширения.

Я этого не заметил, начиная с 2010 года, и класс evtimer начал кодироваться в 2012-2013 годах.так как обновление старого вопроса, теперь есть класс, который может сделать это аналогично javascripts settimeout/setinterval.

6

Несколько вещей, которые я хотел бы отметить о таймерах в PHP:

1) Таймеры в PHP имеет смысл при использовании длительных сценариев (демонов и, возможно, в сценариях CLI). Итак, , если вы не разрабатываете такое приложение, вам не нужны таймеры.

2) Таймеры могут блокироваться и не блокироваться. Если вы используете sleep(), то это таймер блокировки, потому что ваш скрипт просто зависает в течение определенного времени. Для многих задач блокировка таймеров в порядке. Например, отправка статистики каждые 10 секунд. Это нормально, чтобы блокировать сценарий:

while (true) { 
    sendStat(); 
    sleep(10); 
} 

3) неблокируемые таймеры имеют смысл только в управляемых событиях приложений, как WebSocket-сервер. В таких приложениях событие может происходить в любое время (например, входящее соединение), поэтому вы не должны блокировать свое приложение с помощью sleep() (очевидно). Для этой цели существуют библиотеки циклов событий, такие как reactphp/event-loop, что позволяет обрабатывать несколько потоков неблокирующим образом, а также имеет функцию таймера/интервала.

4) Возможны неблокирующие таймауты в PHP. Он может быть реализован с помощью функции stream_select() с параметром тайм-аута (см., Как он реализован в reactphp/event-loop StreamSelectLoop::run()).

5) Есть PHP расширения как libevent, libev, event, которые позволяют реализовать таймеры (если вы хотите идти хардкор)

Смежные вопросы