Мне нужно, чтобы процесс PHP работал в фоновом режиме, даже если я перенаправил на другой URL - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение PHP, которое выполняет команды FFMPEG для кодирования видео, а затем загружает закодированное видео на YouTube с помощью YouTube v3 API.

Я использую shell_exec для выполнения действий FFMPEG и работает очень хорошо. Проблема в том, что я использую вызов AJAX для запуска всего процесса, и мне нужно держать пользователя на странице, где я выполняю AJAXвызов, я намерен выполнить вызов AJAX, чтобы запустить весь процесс и сразу же перенаправить пользователя на другую страницу. Проблема в том, что когда я перенаправляю на другую страницу, процесс PHP прерывается, есть любая форма для выполнения вызова AJAX, перенаправления иподдерживать процесс PHP в фоновом режиме?

1 Ответ

0 голосов
/ 24 мая 2018

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

Пример:

shell_exec('php /var/www/html/my_php_app.php > /dev/null 2>/dev/null &');

Часть /dev/null 2>/dev/null сообщает bash об отправке вывода в ноль / ничего.(Нет вывода)

& указывает bash запустить скрипт / команду в фоновом режиме.(Вы даже можете сделать это в обычном терминале ssh / bash!)

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

Если вы не хотите этого (только один экземпляр за раз), вы можете использовать файлы pid / lock.Вот пример того, что вы можете использовать в верхней части вашего php-скрипта, который вызывает shell_exec.

$lock_file = fopen('/var/www/html/my_php_app.pid', 'c');
$got_lock = flock($lock_file, LOCK_EX | LOCK_NB, $wouldblock);
if ($lock_file === false || (!$got_lock && !$wouldblock)) {
    throw new Exception(
        "Unexpected error opening or locking lock file. Perhaps you " .
        "don't  have permission to write to the lock file or its " .
        "containing directory?"
    );
}
else if (!$got_lock && $wouldblock) {
    exit("Another instance is already running; terminating.\n");
}
//Continue with the script.
...