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

На моем веб-сайте у меня есть функция загрузки фидов данных пользователями. Эти каналы данных обычно имеют более 30 000 записей. И каждая запись должна проходить сложный процесс проверки. Таким образом, для выполнения этой задачи для обработки фишек потребуется более 1 часа. Этот длительный процесс неизбежен.

Здесь эти каналы загружаются общественным пользователем. Размер файла меньше 5 Мб текстового файла. Поэтому мы не хотим предоставлять FTP-доступ, а также не хотим предоставлять доступ к командной строке этим пользователям. Только мы предпочитаем предоставлять веб-доступ для загрузки каналов. И мы должны обрабатывать фид сразу же после их загрузки. И после обработки мы также должны отправить им сообщение о почте.

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

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

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

Если есть способ вызвать PHP-скрипт в фоновом режиме, но через веб-доступ, пожалуйста, дайте мне знать.

Пример сценария для упрощения требования

Предположим, что этот пример и помочь мне изменить этот скрипт для достижения результата. У меня есть два PHP-скрипта «thread.php и createfile.php». Файл с именем «thread.php» будет открыт клиентом через веб-браузер. Этот скрипт должен выполнить скрипт «createfile.php». Но ответ займет 20 секунд. Но мы хотим, чтобы он работал в фоновом режиме. И выведите сразу же в браузере.

Ниже приведен код на сценариях примера.

createfile.php ( http://sugunan.net/demo/createfile.php )

<?php sleep(20); @unlink("phpfile.txt"); $myfile = fopen("phpfile.txt", "w") or die("Unable to open file!"); $txt = date("h:i:s")."\n"; fwrite($myfile, $txt); fclose($myfile); mail("someone@example.com","Background process","Process completed"); ?> 

созданный файл отображается на веб-сайте: http://sugunan.net/demo/phpfile.txt

thread.php ( http://sugunan.net/demo/thread.php )

 <pre> <?php echo "Script start at: " . date('h:i:s') . "\n"; include("createfile.php"); //give a method to execute this script but in background without delay echo "Script end at: " . date('h:i:s'); ?> в <pre> <?php echo "Script start at: " . date('h:i:s') . "\n"; include("createfile.php"); //give a method to execute this script but in background without delay echo "Script end at: " . date('h:i:s'); ?> 

Это даст следующий результат с задержкой функции sleep() .

Начало скрипта: 02:53: 27

Сценарий заканчивается: 02:53: 47

Есть ли способ выполнить «createfile.php» без метода include() . И избежать 20-секундной задержки sleep во время обработки «createfile.php» в фоновом режиме?

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

Использовать exec ()

http://php.net/manual/en/function.exec.php

Это позволит вам запустить длительный процесс в другом потоке. Я использовал это для всех других приложений PHP, Python или C для преобразования wav в mp3, преобразования видео или синтаксического анализа через большие файлы XML …

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

EDITED с рабочим кодом на purehuman.info/demo … он фактически записывает файл сейчас. Вот что я хотел бы сделать thread.php похожим:

 <?php echo "Script start at: " . date('h:i:s') . "\n"; exec("php -f createfile.php /dev/null &"); echo "Script end at: " . date('h:i:s'); ?> 

Если вы находитесь в окнах:

 <?php echo "Script start at: " . date('h:i:s') . "\n"; exec("start /B php createfile.php"); //obviously change the paths etc where needed.. echo "Script end at: " . date('h:i:s'); ?> 

нужно отдать должное части окна: как выполнить скрипты PHP в фоновом режиме с помощью EXEC () и CMD

PHP не предназначен для такого рода работы. Но есть трюки, чтобы попытаться это сделать.

Если ваши фиды содержат более 30 000 записей, у вас будут проблемы с тайм-аутом с PHP FPM. Таким образом, ваш скрипт должен работать с CLI CLI (проверьте параметры сервера для таймаута CLI для PHP).

Вы должны посмотреть на Mab Rabbit и запрограммировать задание cron каждую минуту, чтобы consume сообщения в очереди. Вот пример с PHP http://www.rabbitmq.com/tutorials/tutorial-two-php.html

Надеюсь, что это поможет вам

Наконец, я получил рабочий ответ от следующей публикации: php exec command (или аналогичный), чтобы не дождаться результата

Поэтому я редактирую код следующим образом, чтобы заставить мое требование работать. Но я не знаю, как это работает. Я только копирую синтаксис из этого ответа и прошёл его здесь с модификацией.

 <?php echo "Script start at: " . date('h:i:s') . "\n"; exec('bash -c "exec nohup php createfile.php > /dev/null 2>&1 &"'); echo "Script end at: " . date('h:i:s'); ?> 

Здесь php createfile.php будет командой для выполнения PHP-скрипта и продолжения без ожидания вывода.

Благодаря Cristian