Запустить скрипт после завершения фоновой задачи FFMPEG (через PHP) - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть сценарий 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.

1 Ответ

0 голосов
/ 09 ноября 2018

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

Итак, я вижу несколько способов сделать это, по сути, вам нужен 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

Запускает фоновые процессы в Windows и Linux

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

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

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

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

https://github.com/ArtisticPhoenix/Cli

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

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