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

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

фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта

Когда проект растет, появляются ресурсоемкие задачи обработки данных. Например, разбор xlsx (эксель) прайса для обновления цен, или ресайз большой фотографии. Случаи могут быть самыми разнообразными, когда мы не хотим, чтобы пользователь ждал, пока наш скрипт отработает.

В данном посте расскажу, как можно запускать фоновое выполнение PHP скриптов. Следует отметить, что без использования VPS (Virtual Private Server), то есть на обычном шаред хостинге, такой способ не сработает. Строго говоря, диспетчер создавался под Linux, хотя не исключена корректная работа и на FreeBSD. Даже скорее всего будет работать тоже.

В самом диспетчере ничего сложного нет, он скорее имеет больше заморочек по администрированию. Давайте сначала разберем, из чего он состоит со стороны ОС, какие используются команды:

Здесь мы запрашиваем список процессов с именем php. Остальные параметры влияют на отображение результатов, т.е. мы хотим видеть pid, и непосредственно полную команду, включая параметры. Пример вывода этой команды:

12769 php /path/to/1.php /path/to/price.xlsx

Таким образом, мы проверяем, запущена ли уже такая задача, и если запущена, то по умолчанию повторный запуск не производится. Если все же требуется параллельно запустить еще один экземпляр с точно такими же параметрами, можно это указать явным способом.

Это все, теперь сам код диспетчера и пример использования:

Допустим у нас есть php скрипт, который принимает в параметрах путь до файла, читает его и складывает содержимое в другой файл. Причем делает это очень долго (заменим на sleep 😉 )

А вот, как запускать его в фоновом режиме:

Метод launch может принимать 3 параметра. Первый это путь к файлу-скрипту со всеми параметрами; второй – максимальное время выполнения (по умолчанию 300 секунд) и третий разрешено ли запускать копии, то есть точно такие же процессы с идентичными параметрами.

Источник

Запуск PHP скриптов в фоновом режиме

Когда проект растет, появляются ресурсоемкие задачи обработки данных. Например, разбор xlsx (эксель) прайса для обновления цен, или ресайз большой фотографии. Случаи могут быть самыми разнообразными, когда мы не хотим, чтобы пользователь ждал, пока наш скрипт отработает.

В данном посте расскажу, как можно запускать фоновое выполнение PHP скриптов. Следует отметить, что без использования VPS (Virtual Private Server), то есть на обычном шаред хостинге, такой способ не сработает. Строго говоря, диспетчер создавался под Linux, хотя не исключена корректная работа и на FreeBSD. Даже скорее всего будет работать тоже.

В самом диспетчере ничего сложного нет, он скорее имеет больше заморочек по администрированию. Давайте сначала разберем, из чего он состоит со стороны ОС, какие используются команды:

Здесь мы запрашиваем список процессов с именем php. Остальные параметры влияют на отображение результатов, т.е. мы хотим видеть pid, и непосредственно полную команду, включая параметры. Пример вывода этой команды:

12769 php /path/to/1.php /path/to/price.xlsx

Таким образом, мы проверяем, запущена ли уже такая задача, и если запущена, то по умолчанию повторный запуск не производится. Если все же требуется параллельно запустить еще один экземпляр с точно такими же параметрами, можно это указать явным способом.

Это все, теперь сам код диспетчера и пример использования:

Допустим у нас есть php скрипт, который принимает в параметрах путь до файла, читает его и складывает содержимое в другой файл. Причем делает это очень долго (заменим на sleep фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта)

А вот, как запускать его в фоновом режиме:

Метод launch может принимать 3 параметра. Первый это путь к файлу-скрипту со всеми параметрами; второй – максимальное время выполнения (по умолчанию 300 секунд) и третий разрешено ли запускать копии, то есть точно такие же процессы с идентичными параметрами.

$gb — > isRunning ( 13041 ) //PID

В ответ true или false соответственно.

Читайте также

Сегодня я расскажу как можно вести лог скриптов, что отправляют почту методами PHP. Это удобно, если у вас на сервере…

Стандартные библиотеки PHP умеют генерировать только целые случайные числа. Однако, возникают задачи где нужно не целое рандомное число с максимально…

Источник

Как запустить PHP-скрипт в фоновом режиме после отправки формы?

15 ответов

я использую следующую строку для вызова сценария электронной почты:

важно заметить & at конец команды (как указано в @netcoder). Эта команда UNIX запускает процесс в фоновом режиме.

сценарий электронной почты затем выводит в мой файл журнала с помощью >> и выведет что-то вроде этого:

на серверах Linux / Unix вы можете выполнить задание в фоновом режиме с помощью proc_open:

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

PHP exec(«php script.php») можете сделать это.

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

поэтому, если вы перенаправляете вывод в файл журнала (что в любом случае хорошая идея), ваш сценарий вызова не будет висеть, и ваш сценарий электронной почты будет работать в bg.

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

этот второй PHP-скрипт должен быть настроен на запуск как cron.

Как я знаю, вы не можете сделать это простым способом (см. fork exec и т. д. (не работают под windows)), может быть, вы можете изменить подход, использовать фон браузера, публикующего форму в ajax, поэтому, если сообщение все еще работает, у вас нет времени ожидания.
Это может помочь, даже если вам нужно сделать некоторые длительные разработки.

О отправке почты всегда рекомендуется использовать буферизатор, может быть локальным и быстрым SMTP-сервером, который принимает ваши запросы и катушку их в реальный MTA или помещает все в DB, чем использовать cron, который катает очередь.
Cron может быть на другой машине, вызывающей диспетчер очереди очереди как внешний url:

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

фоновое задание звучит как хорошая идея для этого.

вам понадобится доступ ssh к машине для запуска скрипта как cron.

если вы можете получить доступ к серверу через ssh и можете запускать свои собственные скрипты, вы можете сделать простой сервер fifo с помощью php (хотя вам придется перекомпилировать php с posix поддержка fork ).

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

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

предполагая, что вы работаете на платформе * nix, используйте cron и php исполняемый файл.

есть довольно много вопросов, требующих «запуска php без cron»на SO уже. Вот один:

тем не менее, ответ exec () выше звучит очень многообещающе:)

но если мы находимся на одном сервере «Linux» под управлением cpanel, то это правильный подход:

Не используйте fork() или curl если вы сомневаетесь, что можете справиться с ними, это так же, как злоупотреблять вашим сервером

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

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

в моем случае у меня есть 3 парама, один из них-string (mensaje):

в моем процессе.php у меня есть этот код:

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

Источник

PHP: запуск задачи в фоне

Какие самые правильные и надежные подходы стоит использовать, если необходимо запустить некую длительную задачу в фоновом режиме?
Приведу пример, чтобы стало понятней:
есть основной php скрипт, контроллер, который обрабатывает пользовательские действия. Пользователь нажимает в интерфейсе волшебную кнопку, которая должна запустить долгоиграющую задачу и вернуть управление пользователю. При этом не требуется возвращать или как то дополнительно обрабатывать результат работы длительного скрипта.

Знаю, что для подобных задач существуют различные библиотеки для создания очереди сообщений, но конкретно для моего примера это избыточно.
Так же хотелось бы обойтись без cron-task-ов и других ОС-специфичных вещей.

фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта

По-моему, в вашем случае самым простым вариантом будет exec:

К сожалению это будет работать только в *nix, потому что в Windows запустить процесс в фоне не так то просто

фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта

фоновое выполнение php скрипта. Смотреть фото фоновое выполнение php скрипта. Смотреть картинку фоновое выполнение php скрипта. Картинка про фоновое выполнение php скрипта. Фото фоновое выполнение php скрипта

PHP CLI в фоне ведет себя плохо. Из того, что применяется «на скорую руку», хорошо себя ведут BASH, Perl и Python.

В задаче, где надо было беречь ресурсы, поступил так:
1. Скрипт на PHP сохраняет «задание» на BASH в некоторую директорию job
2. Крон ежеминутно запускает некий скрипт dispatcher, написанный на Perl (был жизнеспособный вариант и на BASH) который ищет N самых старых (по last modified time) скриптов из директории job, и запускает их.
3. Запускаемые скрипты первым делом уничтожают (rm) себя, чтобы не Они все равно выполнятся — ведь они уже загружены в ОЗУ. Результаты работы сохраняются в ФС или в БД, для обслуживания логики интерфейса

Число N для каждого конкретного сервера выявляется индивидуально — тестированием.

Был «подводный камень», который по первому разу даже был обнаружен совершенно невовремя — все, что запускает крон, должно работать с абсолютными путями.

Таким образом были сделаны проект вроде ютуба и аналогичный, тоже конвертирующий видео.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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