Поэтому я нашел несколько руководств / руководств для запуска php-скрипта в качестве фонового процесса, но независимо от того, какой код я использую, процесс по-прежнему отображается в браузере.
То, что я делаю, запускает скрипт, который может занять 5-10 секунд (зависит от стороннего API). Я помещал триггер в самую нижнюю часть страницы, чтобы страница выглядела полностью, но я заметил, что в строке состояния браузера по-прежнему отображается страница как загрузка до запуска скрипта. Кроме того, Firebug показывает одно (случайное?) Изображение в качестве загрузки до тех пор, пока скрипт php не будет полностью запущен. Я могу просмотреть сценарий top
и он работает как отдельный процесс. Как я могу заставить браузер перестать ждать, пока он закончит?
Код, который я использую в настоящее время:
shell_exec('sleep 30 >/dev/null 2>/dev/null &');
Я также попытался использовать exec (), но не было никакой разницы.
Отказ от ответственности: мой последний код будет использовать /usr/bin/GET
, сон просто должен быть очевиден в том, что происходит.
Вот довольно минимальное решение, основанное на http://php.net/features.connection-handling#71172 :
<?php ob_end_clean(); ob_start(); ?> <!doctype html> <html> <head> <title>sleep test</title> </head> <body> <h1>sleep test</h1> <p>going to sleep</p> </body> </html> <?php $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); flush(); $start = date(DATE_RSS); sleep(10); file_put_contents('sleep-test.txt', $start."\n".date(DATE_RSS)); ?>
Попытка добавления nohup перед командой. Вам нужно, чтобы PHP отключился от процесса и продолжил работу. Обычно, если родительский процесс завершается, дочерний процесс убивается. nohup предотвратит это, а также не позволит php ожидать завершения дочернего процесса.
shell_exec('nohup sleep 30 >/dev/null 2>&1 &');
Если это случайный образ, который не останавливает загрузку, у вас может быть просто другая проблема.
По крайней мере, я бы проверял, какой процесс занимает слишком много времени, и возьмите его оттуда.
ob_end_flush(); ignore_user_abort(1);
эти две функции помогут вам, если я правильно пойму вашу проблему.
В настоящее время это невозможно.