Почему процесс Php FFmpeg exec () останавливает мое веб-приложение?

#php #ffmpeg

#php #ffmpeg

Вопрос:

Мое веб-приложение разработано в Azure. Когда я запускаю процесс ffmpeg с помощью exec, если размер файла превышает 50 МБ, он останавливает веб-приложение, пока оно не завершит обработку файла. Почему это происходит?

Комментарии:

1. Потому что PHP выполняет одну строку, а по завершении выполняет следующую и т. Д.. Вам нужно будет запустить его в фоновом режиме.

2. Просто чтобы уточнить точку AbraCadaver. Вы замечаете это, когда файл «превышает 50 Мб» только потому, что этот размер занимает достаточно времени, чтобы процесс заметил время, необходимое для его обработки. PHP не является асинхронным и, следовательно, обрабатывает одну инструкцию за раз. Как было предложено AbraCadaver, вместо этого вы можете написать PHP-скрипт, который запускается в фоновом режиме с использованием CRON или любого эквивалента.

3. Как вы сказали, я заметил, что останавливается не приложение, а только php-код..

4. Но проблема не только в странице, на которой запускается exec(). Он блокирует все мои страницы php.

Ответ №1:

Забавно, что я сам запрограммировал это для клиента несколько недель назад.

  1. Вы можете использовать AJAX во внешнем интерфейсе и запускать каждое преобразование через JS.
  2. Вы можете использовать php «демон» 2.0 Запускает программу независимо php converter.php video1.mp4 >/dev/null 2>amp;1 amp;

    2.1 Вы можете запустить обычный скрипт (через веб-сайт), и он может перезапуститься как независимый php converter.php (например, при отправке POST или GET), и программа запустится в скрипте shell_exec('php converter.php daemon'); (например) в фоновом режиме. Затем вы можете проверить с помощью AJAX или, возможно, websocket, завершен ли процесс.

Советы:

  1. Используйте a .lock -file или что-то подобное на случай, если программа может запуститься во второй раз, но она еще не завершена.
  2. Используйте этот репозиторий composer require php-ffmpeg/php-ffmpeg https://github.com/PHP-FFMpeg/PHP-FFMpeg