Отложенное выполнение кода в php

Приветствую!

Столкнулся с таким вопросом — как реализовать следующее:

Пользователь заходит на страницу a.php, его перенаправляет на b.php и в то же время вызывается и выполняется c.php
C.php — ресурсоемкий скрипт, который хотелось бы выполнять в фоновом режиме, в то время как пользователь дальше занимался своими делами на b.php
  • Вопрос задан
  • 10422 просмотра
Пригласить эксперта
Ответы на вопрос 14
Effrenus
@Effrenus
Можно так:
exec("/usr/bin/php /var/www/c.php > /dev/null &");
Тогда exec отпустит консоль и скрипт b.php будет выполняться дальше а c.php будет работать в бэкграунде.
Ответ написан
witbier
@witbier
ZendX_Console_Process_Unix. Правда работает только на *никсах и требует php-расширения shmop, pcntl и posix. Зато прост в использовании, как валенок.
Ответ написан
@MOst_53
юзер зашел на страницу и запустился аякс пост-запрос, по-моему самое простое и логичное решение.
Ответ написан
Комментировать
iStyx
@iStyx
В b.php на стороне сервера посылаете POST-запрос (с помощью sockets) на c.php и закрываете соединение не ожидая ответа. Но для этого в c.php необходимо будет включить ignore_user_abort.
Ответ написан
ojiga
@ojiga
c.php грузится аяксом или в iframe.

в скрипте settimelimit(0) чтоб убрать временной лимит

если задачу можно разделить «порция» то хорошо. тогда выполнять небольшими порциями тем же аяксом, тогда можно даже показывать идикатор загрузки.
Ответ написан
Комментировать
@Nc_Soft
Зашли на a.php, создали файл task.txt со строчкой для параметров (если надо)
Затем по крону у нас запускается раз в миниту пхп скрипт-чекер файла task.txt, который и выполняет нужную команду
exec("/usr/bin/php /var/www/c.php > /dev/null ");
Ответ написан
Комментировать
Shedar
@Shedar
Посмотрите Gearman ( gearman.org/ ). Он как раз под такие цели подходит и есть интеграция с php. Обзорная статья — highload.com.ua/index.php/2010/07/09/gearman-и-php-асинхронные-задачи/
Ответ написан
witbier
@witbier
ну, коль скоро про кроны речь зашла, то тогда man at
Ответ написан
Комментировать
@BasilioCat
Если у вас собственный сервер или VPS используйте beanstalkd — это сервер очередей. Написан на Сях, простой, быстрый, достаточно много фичей вроде отложенной на заданное время задачи. Интерфейс к пыху — клиентский (не расширение), хотя по мне так можно свой на сокетах написать — протокол там очень простой
Ответ написан
Комментировать
digi
@digi
Поисковые боты и рядовые посетители не особо-то щадят ваш веб-сервер. Оптимизированный ежеминутный крон-запрос затеряется на их фоне. Если нет обязательного соединения с БД при любом клиентском запросе + флаг наличия задач в очереди висит в кеше (memcached, файл и т.п.), то эта нагрузка не будет критичной.
Ответ написан
Комментировать
Arekus
@Arekus
fpm — «fastcgi_finish_request() — special function to finish request and flush all data while continuing to do something time-consuming»
Ответ написан
Комментировать
@MOst_53
юзер зашел на страницу и запустился аякс пост-запрос, по-моему самое простое и логичное решение.
Ответ написан
Комментировать
AvrGavr
@AvrGavr
что бы парралельно выполнять скрипт с в фоновом режиме, есть такая штука как потоки.
В syphony есть годная реализация — Process
В проект встраивается очень просто.
Запустите в b.php отдельный процесс когда вам будет нужно, при этом если вдруг c.php упадёт b продолжит выполняться
Ответ написан
Комментировать
@lepjep
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы