Выполнение exec() или system() на PHP и не ждите вывода


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

Редактировать: Я на CentOS 6, PHP 5.3

Author: adrianTNT, 2012-01-18

5 answers

Зависит от используемой вами операционной системы.

Для linux:

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

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

Для Windows:

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

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

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

 16
Author: Eduard Luca, 2012-01-18 13:13:48

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

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

В прошлом я добился большого успеха с помощью обоих методов (cron/очередь).

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

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

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

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

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

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

ГРУША System_Daemon

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

 4
Author: Darren Newton, 2017-05-23 12:26:27

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

 1
Author: poojitha, 2012-01-18 12:28:44

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

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

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

 1
Author: Uku Loskit, 2012-01-18 13:13:55

Что я делаю:

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
Author: Michael J. Calkins, 2013-03-08 04:19:12