запуск скрипта php в фоне

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Запуск скрипта php в фоне

запуск скрипта php в фоне. ImOnGitHub. запуск скрипта php в фоне фото. запуск скрипта php в фоне-ImOnGitHub. картинка запуск скрипта php в фоне. картинка ImOnGitHub. Какие самые правильные и надежные подходы стоит использовать, если необходимо запустить некую длительную задачу в фоновом режиме? Приведу пример, чтобы стало понятней: есть основной php скрипт, контроллер, который обрабатывает пользовательские действия. Пользователь нажимает в интерфейсе волшебную кнопку, которая должна запустить долгоиграющую задачу и вернуть управление пользователю. При этом не требуется возвращать или как то дополнительно обрабатывать результат работы длительного скрипта. запуск скрипта php в фоне. portfolio. запуск скрипта php в фоне фото. запуск скрипта php в фоне-portfolio. картинка запуск скрипта php в фоне. картинка portfolio. Какие самые правильные и надежные подходы стоит использовать, если необходимо запустить некую длительную задачу в фоновом режиме? Приведу пример, чтобы стало понятней: есть основной php скрипт, контроллер, который обрабатывает пользовательские действия. Пользователь нажимает в интерфейсе волшебную кнопку, которая должна запустить долгоиграющую задачу и вернуть управление пользователю. При этом не требуется возвращать или как то дополнительно обрабатывать результат работы длительного скрипта. запуск скрипта php в фоне. phd. запуск скрипта php в фоне фото. запуск скрипта php в фоне-phd. картинка запуск скрипта php в фоне. картинка phd. Какие самые правильные и надежные подходы стоит использовать, если необходимо запустить некую длительную задачу в фоновом режиме? Приведу пример, чтобы стало понятней: есть основной 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)

Стоит такая задача:

Вот пример скрипта консольного (файл test.php):

Когда клиент посылает запрос, мы его обрабатываем:

Здесь мы просто выполняем наш тестовый скрипт и все.

Запрос приходит аяксом. Скрипт запускается, все хорошо, отрабатывает. Кнопка снова активируется.

Проблема:

Как это можно исправить?

4 ответа 4

Думаю, с таким подходом — никак. Потому что этот скрипт занимает весь Thread.

Есть вариант запускать exec(«/path/to/file/test.php &»); но не так, а так: exec(«/usr/bin/php /var/www/path/to/file/test.php &»); и не спать, а переложить выполнение на этот второй процесс. А если нужны данные ответа твоего «/path/to/file/test.php», то брать их из sdtout или в самом скрипте «test.php» записать вывод в файл — его наличие как-раз оповестит о том, что скрипт выполнился.

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

А то что написано у тебя, работать по твоей логике не будет.

//UPD комменты жгут как обычно. Их нехватает.

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

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

Если ты не можешь выбрать из предложенных вариантов ни одного, тогда тут мало кто тебе чем поможет, можешь пойти изобрести велосипед :). Я дальше, честно не знаю чем тебе помочь. Ты настаиваешь на каком-то своем решении вопроса, не вчитываясь в ответы других.

Источник

Утилита для запуска PHP-скриптов в фоновом режиме

Предисловие

Описание утилиты

Почему не использована консоль, pcntl_fork()

Когда писал утилиту, рассчитывал на то, что приидется использовать на разных серверах и в разных условиях, в которых не всегда можно воспользоваться консолью (платный / бесплатный хостинг) и в условиях, когда PHP используют как модуль Apache (в таком случае про pcntl_fork() можно забыть).

Принцип действия
Скрипт создается / редактируется в браузере

В случае, если нужно работать с телефона / планшета, или нет FTP-доступа к серверу. Использован замечательный редактор ace (ajax.org).

Запуск скрипта

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

Ход работы скрипта

Мы можем видеть все сообщения, которые выводит скрипт, в реальном времени.
Для вывода сообщений в консоль (импровизированную, в окне браузера), скрипт должен вызвать функцию
После этого браузер получает сообщение об изменениях в файле консоли и обновляет консоль в браузере, уже с нашим сообщением (механизм долго объяснять, если кому-то интересно — могу написать по этой теме статью).

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

Если скрипт рассчитан на «прослушку» чего-то (бесконечный цикл, пока что-то не поменяется), и в нем не установлены задержки, то он сразу же загрузит процессор по завязку. Во избежание сего предусмотрена функция
которая добавляет паузу в милисекундах (ms, в данном примере равно 1 секунде) и устанавливает статус процеса «спящим / ожидающим».

Два скрипта (и больше), работающих паралельно, могут обмениваться данными между собой. Для обмена данными использованы файлы.
К примеру, первый скрипт (first) вызвал функцию
а второй скрипт (second), который прослушивал «память» первого скрипта, заметил изменения
и изменил что-то

(этот пример есть в скриптах на GitHub)

Данные в скрипт можно передать через консоль. В таком случае скрипт должен прослушивать ввод

Примечание

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

Достаточно скинуть все содержимое в одну папку и зайти в нее через браузер.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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