Выполните процесс ffmpeg в фоновом режиме

От здесь .

“Slug” является газетным термином, но что это означает, вот заключительный бит URL. Например, сообщение с заголовком, бит “A о Django” станет, “bit-about-django” автоматически (можно, конечно, изменить его легко если Вы don’t как автоматически сгенерированный краткий заголовок).

5
задан Pascal MARTIN 29 July 2009 в 04:53
поделиться

2 ответа

Можно ли создать отдельный .php файл, который затем запускается из php cli выполнить одну из этих функций?

Вероятно, я бы сделал это следующим образом:

  • веб-страница PHP добавляет запись в базу данных, чтобы указать, что «этот файл должен быть обработан»
    • и отображает сообщение пользователю; что-то вроде «ваш файл скоро будет обработан»
  • В интерфейсе командной строки выполните пакетную обработку новых вставленных файлов
    • сначала отметьте запись как «обрабатывающуюся»
    • выполните функцию ffmpeg
    • отметьте файл как «обработанный»
  • И на веб-странице вы можете показать пользователю, в каком состоянии находится его файл. :
    • если он еще не был обработан
    • , если он обрабатывается
    • или если он был обработан - вы можете дать ему ссылку на новый видеофайл.

Вот еще пара мыслей:

  • Когда ваше приложение станет больше, вы сможете:
    • один «веб-сервер»
    • множество «серверов обработки»; в вашем приложении это функция ffmpeg, которая потребует много ресурсов процессора, а не обслуживает веб-страницы; так что возможность масштабировать эту часть - это хорошо (другое - «заблокировать» файлы, обозначив их как «обрабатываемые» в БД: таким образом у вас не будет нескольких серверов обработки, пытающихся обработать один и тот же файл)
  • Только вы использовать PHP с веб-сервера для создания веб-страниц, что является задачей веб-сервера
    • Тяжелая / долгая обработка - это не работа веб-сервера!
    • В тот день, когда вы захотите переключиться на что-то другое, кроме PHP для части "обработки", это будет проще.

Ваш " скрипт обработки "должен запускаться каждые пару минут; вы можете использовать cron для этого, если вы работаете на Linux-подобной машине.


Изменить: немного больше информации после просмотра комментария

Поскольку часть обработки выполняется из CLI, и не из Apache, вам не нужны какие-либо «фоновые» манипуляции: вы можете просто использовать shell_exec , который вернет весь вывод команды вашему PHP-скрипту, когда он закончит свою работу.

] Для пользователя, просматривающего веб-страницу с надписью «обработка», это будет казаться фоновой обработкой; и в каком-то смысле это будет, поскольку обработка будет выполняться другим процессом (возможно, даже на другой машине).

Но для вас это будет намного проще:

  • одна веб-страница (ничего "фона")
  • один сценарий CLI, и без фона.

Ваш сценарий обработки мог бы выглядеть примерно так, я полагаю:

// Fetch informations from DB about one file to process
// and mark it as "processing"

// Those would be fetched / determined from the data you just fetched from DB
$in_file = 'in-file.avi';
$out_file = 'out-file.avi';

// Launch the ffmpeg processing command (will probably require more options ^^ )
// The PHP script will wait until it's finished : 
//   No background work
//   No need for any kind of polling
$output = shell_exec('ffmpeg ' . escapeshellarg($in_file) . ' ' . escapeshellarg($out_file));

// File has been processed
// Store the "output name" to DB
// Mark the record in DB as "processed"

Действительно проще, чем вы сначала думали, не так ли? ;-)
Только не беспокойтесь о фоновых вещах: важно только, чтобы скрипт обработки запускался регулярно из crontab.


Надеюсь, это поможет: -)

10
ответ дан 13 December 2019 в 22:13
поделиться

Для этого не нужно писать отдельный скрипт php (хотя вы можете захотеть сделать это позже, если реализуете какую-то систему очередей).

Вы почти у цели. Единственная проблема заключается в том, что блоки вызова shell_exec () ждут возврата оболочки. Вы можете избежать этого, если перенаправите весь вывод команды в оболочке, чтобы уничтожить файл или / dev / null и выполнить задачу в фоновом режиме (с помощью оператора &). Таким образом, ваш код будет выглядеть следующим образом:

//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0)
{
    if($Priority) {
        shell_exec("nohup nice -n $Priority $Command 2> /dev/null > /dev/null &");
    } else {
        shell_exec("nohup $Command 2> /dev/null > /dev/null &");
    }
}

Я не думаю, что есть какой-либо способ получить PID, к сожалению.

0
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: