как сделать очередь в php с mysql - PullRequest
3 голосов
/ 13 марта 2010

гип,

В моем скрипте я запускаю функцию exec (), чтобы создать файл фильма с помощью ffmpeg.

проблема в том, что ffmpeg может работать только 1 раз на сервере,

если 2 человека находятся в сети на сервере и первый из них уже запущен ffmpeg, я хочу, чтобы второй дождался первого завершения процесса

как закодировать это?

спасибо

Ответы [ 4 ]

3 голосов
/ 13 марта 2010

Установите замок где-нибудь.

Когда запускается ffmpeg, установите флаг в файле или таблице базы данных, чтобы пометить его как выполняющийся. Каждый раз, когда запускается ffmpeg, проверьте, не установлено ли значение флага «1», и, если это так, подождите и повторите попытку через 5 или 10 секунд. Затем, когда процесс завершится, установите флаг на «0». Убедитесь, что в случае сбоя или в вашем скрипте произошла ошибка, при которой для флага снова установлено значение «0».

Или, скорее всего, вы можете запустить процесс ffmpeg от имени другого пользователя и одновременно запускать более одного.

3 голосов
/ 13 марта 2010

Ради любви к Джебусу, не создавайте свою собственную очередь . Напишите демон, который собирает сообщения и обрабатывает файлы.

2 голосов
/ 13 марта 2010
  1. Почему вы не используете видеохостинг (бесплатно), как, например, youtube / vimeo для этого, который лучше подготовлен для обработки, чем вы когда-либо могли бы быть. У Youtube есть API для всех видов вещей.
  2. Вы используете exec с общего хостинга ? Если это так, предупреждаем, что вас забанят, потому что на виртуальном хостинге вам не нравится использовать процессор таким образом. Они хотят короткие запросы Http (в течение 30 секунд). Остальное не относится к вашему хостингу, вы должны сначала обновить.
  3. Как сказал Игнасио, вам следует установить очередь сообщений (требуется linux box с доступом к оболочке), например:

    1. redis Если у вас есть linux-бокс с доступом по ssh, самый простой способ установить это redis. Тогда ваш длительный процесс fffmpeg (скрипт php) должен подключиться к redis и извлекать сообщения из очереди одно за другим, когда будете готовы к обработке видео. Клиент должен просто поместить сообщение в очередь. Я бы посоветовал посмотреть это быстрое видео , чтобы получить основы Redis.
    2. beanstalkd
    3. Gearman

Надеюсь, это вам немного поможет. Я также пишу простую очередь задач в Java, но я еще не закончил. надеюсь, примерно через неделю я смогу представить свою первую версию на github.

0 голосов
/ 13 марта 2010

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

Для очереди PHP вы можете попробовать Dropr или аналогичный.

...