Продолжить php после закрытия страницы exec () ffmpeg - PullRequest
0 голосов
/ 20 февраля 2019

Мне интересно, как я могу продолжить страницу php после exec() ( ffmpeg ) и страница была закрыта.

У меня есть форма, которая позволяет людям конвертировать свое видеофайлы с ffmpeg, но если пользователь щелкает по странице, exec () продолжает работать, но после этого exec ничего не выполняется.

<?php
   if (!empty($_POST) && $imgDir) {
      exec('"/dir/to/ffmpeg" -f image2 -i "' . $imgDir . '" -r 12 -s 610x489 /dir/to/out.avi', $out);

      /* INSERT statement (Not being executed) */
      $sql = "INSERT INTO requests (userID,image) VALUES (?,?)";
      $stmt= $pdo->prepare($sql);
      $stmt->execute([$user_id, $imgDir]);
   }
?>

Я хочу, чтобы пользователь мог щелкнуть страницу,поэтому им не нужно ждать, и они могут загрузить свой файл позже.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если вы хотите запустить эту команду из PHP в фоновом режиме, вы можете запускать неблокирующие процессы следующим образом:

if(is_resource($proc = proc_open($cmd, [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $pipes)))
{
    stream_set_blocking($pipes[1], false);
    stream_set_blocking($pipes[2], false);

В системе Linux вы можете запустить команду с добавлением nohup, например

$cmd = 'nohup "/dir/to/ffmpeg" -f image2 -i "' . $imgDir . '" -r 12 -s 610x489 /dir/to/out.avi'

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

0 голосов
/ 20 февраля 2019

Распространенным решением в этом типе сценария является разгрузка процесса преобразования в фоновый скрипт (например, задание, регулярно запускаемое cron).Это позволяет избежать проблем с тайм-аутом долго выполняющихся процессов или проблем с некорректным возвратом внешних процессов командной строки.

Веб-страница просто помещает запрос в очередь (например, в таблицу БД) и сохраняетфайл.

Фоновая служба затем выберет следующий элемент из очереди, обработает его и отметит его как завершенный.

Тогда вы должны рассмотреть, как уведомить пользователя.Вы можете отправить им электронное письмо или иметь страницу состояния, где они могут проверить свои вакансии и загрузить любые готовые файлы, или и то, и другое, или какой-либо другой процесс по вашему выбору.Возможно, вы можете позволить пользователю указать, как он хочет получать информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...