php отложить выполнение скрипта
Php отложить выполнение скрипта
Задержки php
Всем привет! Сегодня мы с вами рассмотрим реализацию задержек на php. Итак, поехали!
Для того чтобы выполнить простую задержку необходимо воспользоваться функцией sleep().
В качестве аргумента данная функция принимает в себя количество секунд в течении которых будет длиться задержка. То есть после вызова данной функции должно пройти 3 секунды и только после этого начнет выполняться последующая часть кода.
У функции sleep() есть аналог, а именно функция usleep().
Отличие заключается в том что данная функция принимает значение аргумента в микросекундах.(3000000 мкс = 3 с)
Если мы хотим указать задержку на нечетное количество времени можно воспользоваться функцией nanosleep().
Первым аргументом данная функция принимает количество секунд, а вторым количество микросекунд. В нашем примере мы выполнили задержку в 1.5 секунды.
Можно также выполнять задержки относительно текущего времени.
Делается это через функцию time_sleep_until(). В ней мы указываем количество секунд прошедших с эпохи UNIX, то есть с 1979 года. Сделать это можно через функцию time(). Получив текущее количество секунд прошедших с 1979 Года нам достаточно приплюсовать количество секунд задержки.
Напоследок мы с вами рассмотрим функцию с помощью которой можно ограничить время выполнения скрипта.
Здесь мы сделали задержку в 3 секунды. Однако в самом начале была вызвана функция set_time_limit() с аргументом 2 секунды. Именно с помощью данной функции мы можем ограничивать время выполнения скрипта на заданное время. Так как время выполнения скрипта вместе с задержкой у нас 3 секунды, а ограничение выполнения стоит на 2 секунды, произойдет ошибка.
Если изменить ограничение, к примеру на 4 секунды.
Здесь ошибки уже не будет.
С помощью функции set_time_limit() мы можем выставить неограниченное время выполнения скрипта.
Достаточно в данной функции указать значение 0. Однако перед этим необходимо в файле конфигурации php.ini отключить безопасный режим.
Вот так мы можем реализовывать временные задержки при выполнении php сценариев.
На этом данная статья подошла к концу. Не забывайте оставлять вопросы в комментариях или группе
А на этом у меня все. Желаю вам успехов и удачи! Пока.
Оцените статью:
Статьи
Комментарии
Внимание. Комментарий теперь перед публикацией проходит модерацию
Все комментарии отправлены на модерацию
Запись экрана
Данное расширение позволяет записывать экран и выводит видео в формате webm
Запуск PHP скрипта по расписанию cron. Когда не всё так ясно
В этой статье я расскажу о некоторых тонкостях запуска php-скриптов на хостингах, незнание которых может попортить немало нервов и начинающим программистам, и мастерам средней руки.
Причина написания статьи: проблемы с запуском скриптов на хостингах с разными настройками. А поскольку настройки могут быть разными, информация приводимая для общих случаев могут не подходить и приводить в заблуждения.
Немного теории по этим ссылкам: тут и тут, для тех хочет освежить память.
Случай первый
В настройках операционной системы не указаны пути по умолчанию. Как следствие следующая команда в cron не будет выполнена.
Правильной командой будет второй вариант, где мы пропишем полный путь до интерпретатора php.
Есть ещё несколько способов запуска php скрипта описанных здесь. Интересным будет здесь то, что php скрипт запускается как файл с командами для консоли и тут можно написать целую тучу команд и описать всевозможные варианты на любой вкус. Код выглядит так.
В команде для выполнения в cron прописывается путь к скрипту и только. В скрипте ставятся символы #!, а дальше просто пишем нужные нам команды на языке bash.
Случай второй
Выполнение скрипта при запросе из браузера приводит к выводу страницы в браузер. А при выполнении скрипта через cron приводит к выводу текста страницы в командную строку. Тут может быть несколько вариантов. Система может быть настроена на сохранение результатов вывода в консоль в виде файла. Причем файл этот может размешаться не в самом типичном месте. Постепенно это может забить всё пространство на диске. Часто под сайт дают место в 1 Гигабайт, 500 мегабайт. И даже встречались хостинги с 50 и 10 мегабайт под сайт.
Как вариант, вывод может быть перенаправлен на почтовый ящик, который заботливый хостер ненавязчиво подарил вам и прописал в настройках хостинга как email по умолчанию. При каждом выполнении скрипта весь текст, выводящийся в консоль, будет оформлен в письмо. Проблемы могут начаться неожиданно. Если задание cron выполняется часто, а у почты хостинга прописано ограничение на количество писем в день, почта просто ляжет (заблокируется провайдером как потенциальный спамер). И как неприятные последствия вы получите отказ в регистрации пользователей, уведомление пользователей и д.р., что подвязано на почту.
Решение старо как мир. Нужно сделать перенаправление вывода из консоли в пустоту. Делается это добавлением команды в конце команды крона.
Иногда админы хостинга берут на себя обязанность ненавязчиво поставить их за пользователя. Тут тоже может быть подводный камень.
Случай третий
Ситуация проста. Нужно отладить скрипт, запускаемый планировщиком. Можно попытаться сделать это средствами php, заставлять скрипт писать логии и т.п. Но есть способ куда проще, нужно перенаправить вывод в файл. Команда проста, дополнительный параметр к нашей команде:
Её надо добавить в конце команды:
Знак «>» указывает системе о перенаправлении вывода. Далее имя файла. В нашем случае указан абсолютный путь. Этот пример не составляет труда найти в интернете. Но тут нас может поджидать неприятность, вытекающая из второго случая. Заботливый хостер автоматически добавляет перенаправление вывода в конце нашей строки. И иногда маскирует это. В итоге получается команда вида:
В итоге вывод снова перенаправлен в пустоту и выходной файл будет пуст. Тут хостеру можно указать на его ошибку, что он уж слишком перехитрил с настройками. А можно сразу воспользоваться костылём. После команды перенаправления в файл закончить команду символами &&. Эти два символа используются в командной строке для объединения нескольких команд в одной строке. Они дают командной строке понять, что команда окончена и дальше идет следующая команда. К ней и применяется перенаправление в пустоту. В итоге и перенаправление в пустоту осталось и лог файл записан верно. Пример команды:
Случай четвёртый
Первое, что находишь в интернете по этой проблеме – совет прописать в кроне команду смены директории:
Но в каких-то случаях это не помогает. Выход есть. Один из них взять всё в свои руки и задать недостающее окружение для работы скрипта. Информации про это в интернете уже больше.
Иногда просто хватает вписать следующий код в начале скрипта и пути снова становятся рабочими.
Как видите, всё прописано функциями и утруждаться настройками не надо.
sleep
(PHP 4, PHP 5, PHP 7, PHP 8)
sleep — Задержка выполнения
Описание
Список параметров
Время остановки в секундах.
Возвращаемые значения
Возвращает 0 в случае успешного выполнения или false в случае возникновения ошибки.
Если вызов был прерван сигналом, функция sleep() возвратит значение, не равное нулю. В Windows это значение всегда будет равно 192 (значение константы Windows API WAIT_IO_COMPLETION ). На других платформах возвращаемом значением будет количество секунд, оставшихся до задержки.
Ошибки
Примеры
Пример #1 Пример использования sleep()
// ожидание в течениe 10 секунд
sleep ( 10 );
Этот пример выведет (через 10 секунд)
Смотрите также
User Contributed Notes 24 notes
This may seem obvious, but I thought I would save someone from something that just confused me: you cannot use sleep() to sleep for fractions of a second. This:
re: «mitigating the chances of a full bruit force attack by a limit of 30 lookups a minute.»
Maybe obvious, but this my function to delay script execution using decimals for seconds (to mimic sleep(1.5) for example):
it is a bad idea to use sleep() for delayed output effects as
1) you have to flush() output before you sleep
2) depending on your setup flush() will not work all the way to the browser as the web server might apply buffering of its own or the browser might not render output it thinks not to be complete
netscape for example will only display complete lines and will not show table parts until the
tag arrived
so use sleep if you have to wait for events and don’t want to burn to much cycles, but don’t use it for silly delayed output effects!
I wrote a simple method for sleeping with a float, which also allows you to do milliseconds (via fractional seconds).
=> 0.10017800331116
0.25 => 0.25016593933105
0.5 => 0.50015211105347
1 => 1.0001430511475
1.5 => 1.5003218650818
2 => 2.000167131424
2.5 => 2.5002470016479
?>
Sleep method with parameter in milliseconds :
An example of using sleep to run a set of functions at different intervals. This is not a replacement for multi-threading, but it could help someone that wants to do something cheap. You don’t have to use eval(). It is just used as an example. This is different than running a standard 1 second sleep loop, due to sleeping longer does not consume as much CPU.
// Add some timers (in seconds) with function calls
$sleeptimers = array();
$sleeptimers [ ‘5’ ][ 0 ][ ‘func’ ] = ‘function_a();’ ;
$sleeptimers [ ’10’ ][ 0 ][ ‘func’ ] = ‘function_b();’ ;
$sleeptimers [ ’15’ ][ 0 ][ ‘func’ ] = ‘function_c();’ ;
If you are having issues with sleep() and usleep() not responding as you feel they should, take a look at session_write_close()
as noted by anonymous on comments;
«If the ajax function doesn’t do session_write_close(), then your outer page will appear to hang, and opening other pages in new tabs will also stall.»
Notice that sleep() delays execution for the current session, not just the script. Consider the following sample, where two computers invoke the same script from a browser, which doesn’t do anything but sleep.
usleep
(PHP 4, PHP 5, PHP 7, PHP 8)
usleep — Задержка выполнения в микросекундах
Описание
Откладывает выполнение программы на указанное число микросекунд.
Список параметров
Замечание: В Windows система может откладывать исполнение дольше указанного количества микросекунд, в зависимости от аппаратного обеспечения.
Возвращаемые значения
Функция не возвращает значения после выполнения.
Примеры
Пример #1 Пример использования usleep()
// ждать 2 секунды
usleep ( 2000000 );
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 12 notes
On both MacOS X and Linux the usleep() call seems to consume CPU cycles, whereas sleep() and time_nanosleep() do not. This was the same on PHP 5.3.29 and 5.5.29.
I used a loop with just a call to sleep/usleep/time_nanosleep, and compared them all with an empty loop. Obviously the empty loop consumed 99% of the CPU, sleep used 0%, usleep used 3% for 1000ms and 6% for 100ms, and time_nanosleep used 0% for both 500ms and 1000ms.
If you’re using Windows then you maybe are in trouble with usleep if you really need to use it.
The Bernie’s microdelay function using fsockopen does not work properly, and the fclose doesn’t help much.
Though another solution should be found, and googling a bit I fount a WinAPI function: Sleep.
So I get with this snippet wich works fine for me, you get milliseconds precission but the more important, it works for long-run scripts and of course, it does not waste any CPU cycles.
// USleep alternative for Windows and PHP4:
$GLOBALS[‘win32api’]->registerfunction(«long Sleep (long dwMillisecods) From kernel32.dll»);
I have spent DAYS trying to create a reliable usleep()-replacement for Windows.
I have only this to offer:
If you need this function, upgrade your project to PHP 5.
Or settle for 1-second delays with the sleep()-function.
These, unfortunately, seem to be your only options.
Note that this function has an overhead!
This block is running about 70 seconds on my server.
Script take about 70 microseconds for every usleep() function call.
I have noticed that this consumes a lot of system CPU (at least in my limited testing) possibly from all of the system calls or the huge mathematical functions I used to test the effectiveness of the script.
Dude you are SO the man for that code snippet. It worked like a charm. I just wanted to point out a couple things and offer my own improvement.
1. If you’re like me, you were probably wondering why the socket had to keep being recreated on each call, and why you couldn’t just create a static socket. Its because socket_select assumes you’re passing in a pointer, and will alter the variable on return to reflect the actual sockets that were changed.
2. I couldn’t figure out for the life of me why socket_select wasn’t defined. Its because you hadn’t enabled the right extension in php.ini
Ok so heres my slight improvement. The only real thing I did is use a static variable for the socket, to avoid creating a brand new socket on each call of this function. I’m not sure if socket creation will cause things to crash down the line like the other problems reported on here, but if you ask me better safe then sorry.
function Sleeper($mSec)
<
// For dummies like me who spent 5 minutes
// wondering why socket_create wasn’t defined
if(!function_exists(‘socket_create’)) <
die(«Please enable extension php_sockets.dll»);
>
// Do the waiting
socket_select($read=NULL,$write=NULL,$pSock,0,$uSex);
Как увеличить время выполнения PHP-скрипта?
Если вы разрабатываете крупный проект, то на обработку некоторых данных ему может потребоваться большое количество времени. На разных хостингах стоят свои лимиты на такие действия, и если сюда вас привела необходимость увеличить это время – то я подробно расскажу, как это можно сделать.
Чтобы вы понимали, о чем идет речь, приведу небольшой пример. При выходе за выставленные рамки времени вы можете получить следующего рода ошибку:
Я расскажу о 4-х способах, как избавиться от нее.
Но стоить начать с того, что в каждом отдельном случае все перечисленные способы могут не работать, так как некоторые хостинг-провайдеры запрещают самим изменять этот параметр.
Увеличение времени выполнения PHP-скрипта через конфигурационный файл php.ini
В качестве первого способа для увеличения времени выполнения скрипта мы будем использовать файл конфигурации php.ini.
Для того чтобы точно узнать, где находится этот файл, прочитайте эту статью.
Открываете его удобным для вас способом и в самый низ вставляете:
Где «300» означает 300 секунд (меняете на свое). Этот файл, к сожалению, не на всех хостингах доступен пользователям для редактирования.
Увеличение времени выполнения PHP-скрипта через встроенную функцию «ini_set»
Второй способ основывается на использовании функции «ini_set». Ее вы вставляете непосредственно в сам файл скрипта, желательно в самый верх. Пример:
Здесь значение «300» вы также сменяете на нужное вам в секундах. Обратите внимание, что при использовании PHP в безопасном режиме эта функция будет недоступна.
Увеличение времени выполнения PHP-скрипта через встроенную функцию «set_time_limit»
Третий способ, наверное, один из самых популярных – использование функции «set_time_limit» для изменения времени выполнения скрипта. Также используется непосредственно в самом файле PHP. Пример:
Здесь «300» вы также изменяете на нужное вам значение. Вставлять код желательно в самом верху.
Последний вариант заключается в редактировании файла .htaccess, который находится в корне вашего сайта (если таковой отсутствует – создайте его).
В самый верх этого файла вставьте:
Значение «300» вы также меняете на свое.
Обратите внимание, что во всех случаях время выполнения скрипта указывается в секундах. Помимо этого, значение параметра во всех способах может принимать «0», что означает неограниченное время выполнения.
Как узнать, сколько времени отведено на выполнение PHP-скрипта?
После того, как одним из способов вы попытались изменить время выполнения скрипта, нужно узнать, действительно ли у вас это получилось.
Для этого создайте PHP-файл в корне вашего сайта, где выведите значение установленного времени:
Если время равняется тому, что вы указали – поздравляем вас, вы достигли желаемой цели. В противном же случае прочитайте статью еще раз, напишите в комментариях о вашей проблеме или направьте ее вашему хостинг-провайдеру.