Лучший способ снять тяжелую обработку (например, изменение размера изображения) с запроса PHP - PullRequest
8 голосов
/ 04 апреля 2009

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

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

Ответы [ 5 ]

14 голосов
/ 04 апреля 2009

Если то, что вы делаете, действительно громко, то вы ищете что-то вроде beanstalkd . Это распределенный обработчик очереди работ. Вы просто ставите задание в очередь, а потом забываете об этом.

Конечно, тогда вам нужно что-то на другом конце прочитать очередь и обработать работу. Есть несколько способов сделать это.

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

Преимущество такого подхода заключается в том, что вы можете адаптировать количество рабочих к тому, сколько работы нужно выполнить, и beanstalkd обрабатывает распределенную обработку (в том смысле, что списочные устройства могут быть на разных машинах).

2 голосов
/ 07 апреля 2009

Я использую Perl для длительного процесса в сочетании с beanstalkd. Приятно, что в клиенте Beanstalkd для Perl есть метод резервирования блокировки. Таким образом, он практически не использует процессорное время, когда нечего делать. Но когда он должен выполнить свою работу, он автоматически начнет обработку. Очень эффективно.

2 голосов
/ 05 апреля 2009

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

Кроме того, вы можете просто заставить PHP выполнить скрипт и продолжить. Чтобы PHP не дождался завершения сценария, прежде чем продолжить, запустите его в фоновом режиме.

exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &");

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

2 голосов
/ 04 апреля 2009

Вы можете установить задачу cron, которая будет проверять таблицу очередей. Сценарий, который обрабатывает действия, ожидающие в очереди, может быть написан, например, в php, поэтому вам не нужно менять язык реализации.

1 голос
/ 01 июня 2012

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

Вот статья о том, как выполнить несколько преобразований обработки изображений:

http://dev.iron.io/solutions/image-processing/

Примеры есть в Ruby, но вы можете сделать то же самое с PHP довольно легко.

...