Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Ffmpeg+php запуск списка сгенерированных задач
цитата
26/12/12 в 11:49
 Defolt
На сервере генерируется список вида:
/usr/local/bin/ffmpeg -i /home/sites/.../file.mp4 (параметры ffmpeg) /home/sites/.../file.mp4
...
cp /home/sites/.../file2.mp4 /home/sites/.../file2.mp4
...

Под windows, на локальной машине, записывал в файл *.cmd. Запустил, выполняется.
Каким образом это сделать на сервере с помощью php?
Запуск в цикле с помощью exec() выдает через ~5 минут 504 Gateway Timeout или что-то похожее.
цитата
26/12/12 в 11:56
 Vyacheslav
Я не проффэсор в линуксе, но помоему аналог cmd в линуксе - это bash скрипт.
http://ru.wikipedia.org/wiki/Bash
цитата
26/12/12 в 12:00
 Defolt

Я тоже icon_wink.gif
Но для этого надо заходить на сервер и запускать этот скрипт. Хотелось бы чтобы задача выполнялась из браузера.
цитата
26/12/12 в 12:57
 Vyacheslav
Код:
<?php
   echo "Starting ffmpeg...\n\n";
   echo shell_exec("ffmpeg -i input.avi output.avi &");
   echo "Done.\n";
?>


http://ffmpeg.org/trac/ffmpeg/wiki/Using%20FFmpeg%20from%20PHP%20scripts
цитата
26/12/12 в 13:06
 Alexandur
Судя по:
Defolt писал:
выдает через ~5 минут 504 Gateway Timeout или что-то похожее

поставь в скрипте set_time_limit(0)
цитата
26/12/12 в 14:48
 Mika
Или запусти процесс в фоновом режиме.
update: Vyacheslav как раз это и написал

Последний раз редактировалось: Mika (26/12/12 в 14:49), всего редактировалось 1 раз
цитата
26/12/12 в 14:48
 idk2045
браузер для таких вещей не лучший вариант.. но как костыли сойдет)
по хорошему в браузере ты должен закидывать задания в очередь, а крон скрипт на серваке подхватывать их из очереди (базы).
цитата
26/12/12 в 15:34
 Defolt
Vyacheslav писал:
Код:
<?php
   echo "Starting ffmpeg...\n\n";
   echo shell_exec("ffmpeg -i input.avi output.avi &");
   echo "Done.\n";
?>


http://ffmpeg.org/trac/ffmpeg/wiki/Using%20FFmpeg%20from%20PHP%20scripts


Это для запуска команды. У меня запуск производится функцией exec(); Отличие shell_exec в выводе информации - массив или строка (если правильно нагуглил);
Код:
$command = "/usr/local/bin/ffmpeg -i /home/sites/.../file.mp4 (параметры ffmpeg) /home/sites/.../file.mp4"." 2>&1";
exec($command,$output,$status);


gimcnuk писал:
поставь в скрипте set_time_limit(0)

Не работает icon_sad.gif Поставил set_time_limit(0); Перед exec();

Mika писал:
Или запусти процесс в фоновом режиме.
update: Vyacheslav как раз это и написал

Проверил список процессов на сервере. Как оказалось, браузер через 5 минут выдал 504 ошибку, а на сервере продолжают выполняться команды ffmpeg. B конечном итоге все задачи выполнены.
grozny писал:
браузер для таких вещей не лучший вариант.. но как костыли сойдет)
по хорошему в браузере ты должен закидывать задания в очередь, а крон скрипт на серваке подхватывать их из очереди (базы).

Как это сделать, можно похожий пример? В какую сторону "копать".
Можно ли так сделать: после отправки списка на выполнение, через время захожу на страницу, а она мне выдает готово или нет?
цитата
26/12/12 в 15:40
 Alexandur
Добавь в цикл ob_flush() и flush()
http://php.net/manual/ru/function.flush.php - примеры внизу
цитата
26/12/12 в 16:01
 Mika
Defolt писал:
Проверил список процессов на сервере. Как оказалось, браузер через 5 минут выдал 504 ошибку, а на сервере продолжают выполняться команды ffmpeg. B конечном итоге все задачи выполнены.

Я же сказал: в фоне запускай процесс. То, что у тебя на конце стоит 2>&1, означает stderr в stdout выводить. Для того, чтобы в фоне запустить, надо & в конце добавить, что и сделано в примере Vyacheslav'а.
цитата
26/12/12 в 17:06
 Defolt
gimcnuk писал:
Добавь в цикл ob_flush() и flush()
http://php.net/manual/ru/function.flush.php - примеры внизу

Спасибо, помогло. В конечном итоге браузер вывел данные, а не 504 ошибку.

Mika писал:
Я же сказал: в фоне запускай процесс. То, что у тебя на конце стоит 2>&1, означает stderr в stdout выводить. Для того, чтобы в фоне запустить, надо & в конце добавить, что и сделано в примере Vyacheslav'а.

2>&1 выдаст ошибку в переменную $status.
& - задача будет выполнена в фоне и не выдаст результатов.
Объясни плиз для тех кто в танке, а то не догоняю что к чему и как будет работать
цитата
26/12/12 в 17:58
 Mika
Defolt писал:
2>&1 выдаст ошибку в переменную $status.

Инструкция "2>&1" означает перенаправление потока stderr в поток stdout. А переменная $status, согласно мануалу по exec "будет содержать статус завершения внешней программы".

Defolt писал:
& - задача будет выполнена в фоне и не выдаст результатов.

А разве выполнение задачи не является для тебя главным результатом?
Если ты не будешь запускать задачу в фоне, то при остановке php-скрипта (например, при закрытии браузера), задача твоя тоже убьется, так что сам решай, что для тебя важнее.
цитата
26/12/12 в 18:10
 Defolt
Mika писал:
А разве выполнение задачи не является для тебя главным результатом?
Если ты не будешь запускать задачу в фоне, то при остановке php-скрипта (например, при закрытии браузера), задача твоя тоже убьется, так что сам решай, что для тебя важнее.

Теперь ясно для чего нужен &.

Спасибо всем ответившим. Вопрос решен, главный результат достигнут - работает icon_smile.gif


Эта страница в полной версии