video — запустить скрипт после завершения фоновой задачи FFMPEG (через PHP)

У меня есть сценарий PHP, который запускает преобразование файла FFMPEG через shell_exec(),

shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 >/dev/null 2>/dev/null &');

Это происходит в фоновом режиме (отсюда &), т. е. сценарий завершается до завершения преобразования.

Есть ли способ вызвать и выполнить сценарий PHP (чтобы обновить флаг БД) после завершения преобразования?

Я много гуглил, но мои знания о серверных командах просто не до понимания того, что я читаю (например, этот ответ). Лучшее, что я мог сделать, это перенаправить стандартный вывод в файл через

shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null &');

…но очевидно, что он просто создает и записывает в файл, но не вызывает и не выполняет его через PHP.

0

Решение

Я не очень хорош в серверных командах, поэтому не могу вам помочь. Но у меня есть эта ловкость для выяснения вещей.

Итак, я вижу несколько способов сделать это, по сути, вам нужен PHP, чтобы что-то делать после завершения вызова командной строки. Очевидный ответ состоит в том, чтобы удалить & от конца команды и сделайте так, чтобы она блокировалась, так что PHP торопится сказать, что работа выполнена. Но при этом вы не сможете вернуться к конечному пользователю, пока это не будет сделано.

Опция 1
Поэтому одним из способов является создание своего рода PHP-скрипта Bootstrap, который вы называете неблокирующим. В этом сценарии выполните команду преобразования, которая теперь блокируется, и после этого вернитесь, чтобы PHP сделал что-то еще

 //bootstrap.php
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null'); //blocking
//Update the DB

Затем с вашего контроллера или как вы называете бутстрап неблокирующим

shell_exec('php {pathto}/bootstrap.php 2>/dev/null &');

Таким образом, вызов загрузчика возвращается немедленно, но вызов преобразования блокируется, что дает вам возможность обновить послесловия БД.

Вариант 2

Поскольку преобразование выводит файл, вы можете запустить отдельное фоновое задание, которое отслеживает время изменения выходного файла. Тогда, если измененное время было как минута в прошлом, вы можете предположить, что оно завершило преобразование и обновить БД. Измененное время должно продолжать обновляться, пока данные добавляются в файл.

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

PS. У меня есть код, который может пригодиться на GitHub

Запускает фоновые процессы в обоих окнах & линукс

https://github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php

Блокировка процесса PHP (симуляция Mutex с использованием файлов)

https://github.com/ArtisticPhoenix/MISC/blob/master/ProcLock.php

Отображение аргументов командной строки для программ PHP:

https://github.com/ArtisticPhoenix/Cli

Вы можете использовать их, если это поможет вам.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector