Есть ли функция, аналогичная setTimeout () (JavaScript) для PHP? - PullRequest
25 голосов
/ 08 августа 2010

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

Ответы [ 8 ]

13 голосов
/ 08 августа 2010

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

11 голосов
/ 08 августа 2010

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

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

11 голосов
/ 08 августа 2010

Есть функция sleep, которая приостанавливает выполнение сценария на определенное время.

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

8 голосов
/ 08 августа 2010

Не совсем, но вы можете попробовать функцию подсчета тиков .

7 голосов
/ 06 февраля 2017

Несколько замечаний по поводу таймеров в PHP:

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

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

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

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

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

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

3 голосов
/ 16 ноября 2015

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

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

3 голосов
/ 22 июня 2013

Предупреждение: Вы должны заметить, что хотя команда sleep может привести к зависанию процесса PHP или «спящему режиму» в течение заданного промежутка времени, вы обычно реализуете визуальные задержки в интерфейсе пользователя ,

Поскольку PHP является языком на стороне сервера, просто записывает результаты своего выполнения (обычно в форме HTML) в ответ веб-сервера: использование режима сна таким образом обычно просто останавливает или задерживает ответ.

С учетом сказанного, сон имеет практические цели. Отложенное выполнение может использоваться для реализации схем отмены, например, при повторной попытке запроса после неудачного соединения. Вообще говоря, если вам нужно использовать setTimeout в PHP, вы, вероятно, делаете что-то не так.

Решение: Чтобы ответить на ваш вопрос в явном виде: поскольку setTimeout имеет два параметра, один из которых представляет функцию, которую нужно запустить, а другой - количество времени (в миллисекундах). Следующий код фактически соответствует функциональным требованиям вашего вопроса:

<?php
// Build the setTimeout function.
// This is the important part.
function setTimeout($fn, $timeout){
    // sleep for $timeout milliseconds.
    sleep(($timeout/1000));
    $fn();
}

// Some example function we want to run.
function someFunctionToExecute(){
    echo 'The function executed!';
}

// This will run the function after a 3 second sleep =>
// We're using an anonymous function to wrap the function
// which we wish to execute.
setTimeout(function(){
   someFunctionToExecute();
}, 3000);
?>

Вывод вышеуказанного кода будет с задержкой в ​​три секунды, после чего последует следующий вывод:

Функция выполнена!

2 голосов
/ 14 ноября 2014

если вам нужно выполнить действие после выполнения некоторого php-кода, вы можете сделать это с помощью echo

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

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

...