Я хочу использовать ffmpeg для преобразования видео в .flv в php. В настоящее время у меня это работает, но он зависает браузера, пока файл не будет загружен и не будет завершен. Я смотрел документы php о том, как запустить процесс exec () в фоновом режиме, а также обновлять процесс с помощью возвращаемого PID. Вот что я нашел:
//Run linux command in background and return the PID created by the OS function run_in_background($Command, $Priority = 0) { if($Priority) $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!"); else $PID = shell_exec("nohup $Command > /dev/null & echo $!"); return($PID); }
Существует также трюк, который я использую для отслеживания работы фоновой задачи с использованием возвращаемого PID:
//Verifies if a process is running in linux function is_process_running($PID) { exec("ps $PID", $ProcessState); return(count($ProcessState) >= 2); }
Предполагаю ли я создать отдельный .php-файл, который затем запускается из php cli для выполнения одной из этих функций? Мне просто нужно немного подтолкнуть, чтобы это работало, и тогда я могу взять его оттуда.
Благодаря!
Предполагаю ли я создать отдельный .php-файл, который затем запускается из php cli для выполнения одной из этих функций?
Вероятно, так я и сделал:
Вот пара других мыслей:
Ваш «скрипт обработки» должен запускаться каждые две минуты; вы можете использовать cron для этого, если вы находитесь на Linux-подобной машине.
Изменить: немного больше информации, после просмотра комментария
Поскольку часть обработки выполняется из CLI, а не из Apache, вам не нужны какие-либо «фоновые» манипуляции: вы можете просто использовать shell_exec
, который вернет весь вывод команды в ваш PHP-скрипт, когда он закончит делать это. работа.
Для пользователя, просматривающего веб-страницу с надписью «Обработка», она будет выглядеть как обработка фона; и, в некотором смысле, это будет, так как обработка будет выполняться другим процессом (возможно, даже на другой машине).
Но для вас это будет намного проще:
Ваш сценарий обработки может выглядеть примерно так, я полагаю:
// 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.
Надеюсь это поможет 🙂
Вам не нужно писать отдельный скрипт 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.