Как «раскошелиться» на процесс преобразования видео в фоновый режим, в php? - PullRequest
2 голосов
/ 09 октября 2009

У меня есть скрипт пакетной загрузки, который загружает видео файлы в каталог. Просто. После завершения загрузки он создает запись mysql для этого файла и переходит к следующему файлу в очереди.

Непосредственно перед тем, как это сделать, я хочу, чтобы он вызвал фоновый процесс, который преобразует загруженный avi avi-файл в ipod-совместимый mp4-файл, а также генерирует превью. Как вы можете себе представить, это занимает некоторое время ...... Я могу просто поместить код преобразования в загрузчик файлов ... но он будет зависать для каждого файла в течение хороших 10-20 минут, что является ненулевым (даже ты его функция только для администратора).

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

Будет ли что-то подобное делать эту работу, или мне действительно придется использовать функции php fork?

exec("/usr/bin/php ./convert.php?id=123 > /dev/null 2>&1 &");

Ответы [ 3 ]

1 голос
/ 09 октября 2009

Лучший способ реализовать это архитектурно - это рабочая очередь, в которой ваш PHP-интерфейс передает демону в файлы бэкэнда для преобразования. Отсоедините PHP от своей работы, и ваш пользовательский интерфейс всегда будет отзывчивым.

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

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

См. Мой ответ на этот вопрос , который также имеет отношение.

1 голос
/ 09 октября 2009

Страница руководства php для exec () говорит:

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

Так что, да, ваш exec вызов сделает свое дело.

0 голосов
/ 09 октября 2009

Это сработает, но похоже на неуправляемую идею. Если вы просто собираетесь запустить и не оглядываться назад, все может пойти очень быстро.

Как насчет простого планирования сценария, который запускается каждые несколько минут и опрашивает все, что еще находится в очереди. Есть ли у вас доступ к cron?

...