У меня есть сценарий 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.
Я не очень хорош в серверных командах, поэтому не могу вам помочь. Но у меня есть эта ловкость для выяснения вещей.
Итак, я вижу несколько способов сделать это, по сути, вам нужен 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
Вы можете использовать их, если это поможет вам.
Других решений пока нет …