Есть ли установленный тайм-аут в php?

Есть ли эквивалент PHP для установки тайм-аутов в JavaScript?

В JavaScript вы можете выполнить код по истечении определенного времени с использованием установленной функции тайм-аута.

Можно ли сделать это на PHP?

Вы можете использовать функцию sleep() :

 int sleep ( int $seconds ) // Delays the program execution for the given number of seconds. 

Пример:

 public function sleep(){ sleep(1); return 'slept for 1 second'; } 

PHP является однопоточным, и в целом PHP сфокусирован на цикле HTTP-запроса, поэтому было бы непросто позволить тайм-ауту запускать код, возможно, после завершения запроса.

Я могу предложить вам изучить Gearman как решение делегировать работу другим процессам PHP.

Это уродливо, но в основном работает:

 <?php declare(ticks=1); function setInterval($callback, $ms, $max = 0) { $last = microtime(true); $seconds = $ms / 1000; register_tick_function(function() use (&$last, $callback, $seconds, $max) { static $busy = false; static $n = 0; if ($busy) return; $busy = true; $now = microtime(true); while ($now - $last > $seconds) { if ($max && $n == $max) break; ++$n; $last += $seconds; $callback(); } $busy = false; }); } function setTimeout($callback, $ms) { setInterval($callback, $ms, 1); } // user code: setInterval(function() { echo microtime(true), "\n"; }, 100); // every 10th of a second while (true) usleep(1); 

Функция обратного вызова интервала вызывается только после тикающего оператора PHP. Поэтому, если вы пытаетесь вызвать функцию 10 раз в секунду, но вы вызываете sleep(10) , вы получите 100 исполнений вашей функции тика в партии после завершения сна.

Обратите внимание, что существует дополнительный параметр setInterval который ограничивает количество раз, когда он вызывается. setTimeout просто вызывает setInterval с лимитом одного.

Было бы лучше, если бы функция unregister_tick_function была вызвана по истечении срока ее действия, но я не уверен, что это было бы возможно, если бы не была функция основного тика, которая контролировала и не регистрировала их.

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

Не зная случая использования вашего вопроса, на него трудно ответить:

  • Если вы хотите отправить дополнительные данные клиенту чуть позже, вы можете выполнить тайм-аут JS на стороне клиента с обработчиком, который сделает новый HTTP-запрос для PHP.
  • Если вы хотите запланировать некоторую задачу позднее, вы можете сохранить ее в базе данных и опросить БД в обычных интервалах. Это не лучшее решение, но относительно легко реализовать.

Вам нужно начать новую тему, попробуйте это http://blog.motane.lu/2009/01/02/multithreading-in-php/