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.

Источник

Фоновое выполнение скрипта на PHP без crontab

Озадачили меня тут написать демона на PHP. Т.е. скрипт, который будет заданное количество раз в заданное количество часов в случайное время (всегда случайное) выполнять определенные действия, и все это без использования cron’a.

До этого никогда не заморачивался, а тут после постановки задачи, начал было думать что так нельзя, что php скрипт надо вызывать браузером…ну задача то поставлена, надо выполнять.

Первая мысль — отключить ограничение времени выполнения скрипта. Запрещено хостером.

Вторая мысль — яваскриптом повторять аякс-запрос периодически (да хоть раз в секунду). — нельзя (требование заказчика).

Выяснилось, собственно, что и браузер открыт не должен быть, и крон нельзя использовать, и работать скрипт должен независимо от пользователя, бесконечно долго. Естественно, он должен минимум грузить систему.

1. Пачка сигарет, ночь, гугл, доки, книги, мануалы….
goto 1…

На выходе получаю:
Задача_1:
Реализовать генератор времен выполнения скрипта, исходя из заданных количества раз и количества часов. Хранить где-то эти времена.

Задача_2:
Работать после закрытия браузера

Задача_3:
Не вылетать после окончания ограничения времени выполнения скрипта

Задача_4:
Выполнять в нужное время какие-то действия.

Итак…
Пишем в конфиге исходные данные:

Далее пишем функцию, которая поможет нам сгенерировать времена запуска.
В ней мы генерируем случайное число от 0 до количества секунд в исходном интервале.

Далее сгенерируем и запишем в сессию массив времен запуска. Предварительно отсортируем массив по возрастанию, чтобы сначала шло раннее время (машину времени я еще не успел создать).

Теперь надо заставить скрипт работать, не обращая внимания на максимальное время выполнения, установленное сервером.
Принцип таков:
1) Определяем время начала работы скрипта;
2) Определяем установленное ограничение на время выполнения.
3) Запускаем цикл, внутри которого считаем текущее время и вычисляем общее время работы скрипта, сверяем текущее время со значениями в массиве времен запуска, и если совпадение есть, выполняем заданные действия (у меня они в файле exec.php). Для запуска файлов используем сокеты.
4) Повторяем цикл пока время работы скрипта не приблизится к максимально разрешенному. Я поставил — пока до максимального времени не останется 5 секунд.

Итак… считаем начальные данные по времени:

Собственно, цикл. Комментарии в коде.

Ну и, если разрешенное время подходит к концу, то завершаем цикл и благополучно запускаем этот же скрипт другие процессом (в 5 секунд точно уложимся)

Собственно, готово.
Далее у меня много заморочек было в выполнении тех самых действий — там надо было робота написать для поиска ссылок по заданным ссылкам.

Когда дописал все, озадачился полезным применением…Использовать его можно как службу. Он может следить за чем-то в сети и уведомлять Вас, например, по почте. И не надо никаких cron’ов.

Скрипт можно еще оптимизировать — доработкой не занимался.
Кстати, вот от чего я не смог оторваться — браузер все же придется открыть, чтобы изначально запустить скрипт.

Источник

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 сценариев.

На этом данная статья подошла к концу. Не забывайте оставлять вопросы в комментариях или группе

А на этом у меня все. Желаю вам успехов и удачи! Пока.

Оцените статью:

Статьи

Комментарии

Внимание. Комментарий теперь перед публикацией проходит модерацию

Все комментарии отправлены на модерацию

php отложенное выполнение скрипта

Запись экрана

Данное расширение позволяет записывать экран и выводит видео в формате webm

Источник

Задумался о том, где хранить эти задачи. В той же Mysql базе, что и сам сайт? В файлах? Или может в каком-нибудь Nosql хранилище? Есть ли смысл заморачиваться, или просто хранить в обычной таблице и не мучаться? Буду очень благодарен за советы.

php отложенное выполнение скрипта

php отложенное выполнение скрипта

или просто хранить в обычной таблице и не мучаться?

Скрипт, который вызывается по крону выбирает наиболее старые задачи, у которых статус завершения отсутствует и начинает выполнять.

Лучше уж сделать демона в бесконечном цикле, чтобы не пердолиться с поздно пришедшими уведомлениями и вызовом скрипта, когда прошлый не завершил работу.

php отложенное выполнение скрипта

php отложенное выполнение скрипта

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

php отложенное выполнение скрипта

Тебе нужен обычный оффлоад с очередью. Для разных фреймворков есть стандартные решения.

php отложенное выполнение скрипта

Я правильно понимаю, что ты пытаешься сделать очередь? Если да, то в простейшем случае можно использовать redis (см. rpop, lpush). В более сложном смотри в сторону RabbitMQ.

php отложенное выполнение скрипта

php отложенное выполнение скрипта

заводить еще и редис для тупо очереди это как тащить жквери ради тогглинга одного блока на страничке — красава!

php отложенное выполнение скрипта

заводить еще и редис для тупо очереди это как тащить жквери ради тогглинга одного блока на страничке — красава!

Чувак, ты реально странный. Тут выше sidekiq, gearman и messenger (из symphony?) предлагали, но вызвал негодование у тебя redis, который скорее всего и так используется для хранения сессий и кэша запросов к базе.

php отложенное выполнение скрипта

или просто хранить в обычной таблице и не мучаться?

Прикольно. Особенно когда мы не знаем сколько задач в очереди и как как быстро она наполняется. Будешь делать по одному select’у для каждой записи или хранить буфер в памяти скрипта? Если не использовать индексы, то у тебя будут медленные select’ы, а если использовать, то медленные insert’ы. Любители, блин, микроскопом гвозди забивать.

php отложенное выполнение скрипта

Я вообще не пхп-разработчик. ТС описал свой проект не как какой-то хайлоад, требующий обработки миллиона сообщений в секунду, поэтому сойдёт тупое в лоб решение.

Да, по одной записи. Можно лочить их и сделать несколько воркеров.

Оп это ты сейчас Celery придумал только что. Право не знаю есть ли такое для пхп.

php отложенное выполнение скрипта

выше sidekiq, gearman и messenger (из symphony?) предлагали

Они предлагали готовый инструмент. Но с поправкой что у него там ого-го энтерпрайз.

Конечно, ты же предлагаешь какой-то рукопашный велосипедизм.

когда мы не знаем сколько задач в очереди

Зато мы точно знаем что у него есть мускуль. А ты предлагаешь на его велосипед с квадратными колесами присобачить твой велосипед с треугольными.

получить 100+ компаний — сильно тормозит страницу

Ты не понимаешь какой у него здец в коде если пых с мускулем не тянет 100+ компаний? С твоим редисом/кроликом поверх мускуля в его руках оно и от 50+ сдохнет.

php отложенное выполнение скрипта

Ты не понимаешь какой у него здец в коде если пых с мускулем не тянет 100+ компаний? С твоим редисом/кроликом поверх мускуля в его руках оно и от 50+ сдохнет.

Для 100 компаний нужно во-первых создать 100 сущности Answer(ответ компании), во-вторых создать 100 нотисов. 200 вставок в таблицы работают около 2-х секунд. Я не знаю, может это очень большая цифра, может у меня с серваком что-нибудь не так, но хотелось бы ускорить, поэтому я и решил вынести в фон.

php отложенное выполнение скрипта

Я правильно понимаю, что ты пытаешься сделать очередь

да, правильно, очередь отложенных задач

спасибо большое за ответ

php отложенное выполнение скрипта

Не будет профита. Тебе лишь предлагают хранить очередь в редисе, а не в мускуле. Ну и зачем тебе ещё одна сущность?

Профит ты так и так получишь когда заведёшь свою очередь отложенных задач на бекенде. По крону раз в минуту запускаешь скрипт, который выбирает из таблички очереди все записи, которые ещё не отрабатывались (например, WHERE x = 0 LIMIT 0,10) и отрабатывает их, проставляя «x = 1» или даже удаляя (по айдишнику). Так же, что с редисом, что с мускулем, в любом случае тебе надо делать защиту от запуска второй копии твоего скрипта. А то что там предлагали демона писать на пыхе — гон. Демон на пыхе это нестабильно, он может грохнуться. Так что по крону раз в минуту — самое то. Мыло, в самом тривиальном случае так и рассылается неким воркером по крону.

php отложенное выполнение скрипта

200 вставок в таблицы работают около 2-х секунд

Источник

Как увеличить время выполнения 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-файл в корне вашего сайта, где выведите значение установленного времени:

Если время равняется тому, что вы указали – поздравляем вас, вы достигли желаемой цели. В противном же случае прочитайте статью еще раз, напишите в комментариях о вашей проблеме или направьте ее вашему хостинг-провайдеру.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *