Выполнение exec() или system() на PHP и не ждите вывода
Я хочу запустить команду оболочки в eider exec() или system() из PHP-скрипта, но для выполнения этой задачи требуется некоторое время, есть ли способ запустить ее и продолжить загрузку страницы PHP без задержки?
Редактировать: Я на CentOS 6, PHP 5.3
5 answers
Зависит от используемой вами операционной системы.
Для linux:
pclose(popen("php somefile.php &","r"));
Обратите внимание на амперметр в конце (очень важно).
Для Windows:
pclose(popen("start php.exe somefile.php","r"));
Здесь важно ключевое слово start
.
Надеюсь, это поможет.
Это не дает прямого ответа на ваш вопрос, но вам следует рассмотреть возможность выполнения работы по преобразованию видео в фоновом режиме либо с помощью задания cron, либо с помощью очереди, такой как Beanstalkd.
Таким образом, вы можете наращивать работу ffmpeg в фоновом режиме, не блокируя свой веб-сервер.
В прошлом я добился большого успеха с помощью обоих методов (cron/очередь).
Некоторые другие сообщения о фоновых процессах:
Запустите процесс ffmpeg в фоновом режиме
Использование ffmpeg, PHP и beanstalk
Некоторые инструменты, которые могут вам пригодиться:
Http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
Мы используем ajax-запрос для активации исполнительной части...затем продолжайте выполнять другие задачи
Это должно сработать:
shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
Редактировать: извините, не знаю, почему я исключил &, чтобы поместить его в bg 2> перенаправляет стандартный вывод и стандартный вывод в /dev/null.
Что я делаю:
public function post_create()
{
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo "Tell ajax to gtfo!";
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
}