Выполнение exec () или system () в PHP и не ждать вывода - PullRequest
4 голосов
/ 18 января 2012

Я хочу вызвать команду оболочки в eider exec () или system () из сценария PHP, но это задача, которая требует времени, есть ли способ запустить ее и продолжить загрузку страницы PHP без задержки

Редактировать: я нахожусь на CentOS 6, PHP 5.3

Ответы [ 5 ]

16 голосов
/ 18 января 2012

Зависит от используемой вами ОС.

Для Linux:

pclose(popen("php somefile.php &","r"));

обратите внимание на амперстенд в конце (очень важно).

Для окон:

pclose(popen("start php.exe somefile.php","r"));

здесь ключевое слово start важно.

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

4 голосов
/ 18 января 2012

Это не дает прямого ответа на ваш вопрос, но вам следует подумать о том, чтобы выполнить конвертацию видео в фоновом режиме с помощью задания cron или с использованием очереди, например Beanstalkd.

Таким образом, вы можете сложить работу ffmpeg в фоновом режиме, не блокируя ваш веб-сервер.

У меня был большой успех с обоими методами (cron / queue) в прошлом.

Некоторые другие посты о фоновых процессах:

php выполняет фоновый процесс

Запуск процесса ffmpeg в фоновом режиме

Использование ffmpeg, PHP и beanstalk

Некоторые инструменты, которые могут вам пригодиться:

http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

PEAR System_Daemon

Pheanstalk, библиотека Beanstalkd для PHP

1 голос
/ 08 марта 2013

Что я делаю:

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
}
1 голос
/ 18 января 2012

Это должно работать:

shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");

Редактировать: извините, не знаю, почему я исключил &, чтобы поместить его в bg 2> перенаправляет STDOUT и STDERR в /dev/null.

1 голос
/ 18 января 2012

Хорошо, используйте ajax-запрос для активации exec-части ... затем продолжите выполнение других задач

...