На моем веб-сайте у меня есть функция загрузки фидов данных пользователями. Эти каналы данных обычно имеют более 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