Статьи

Введение в Gearman — Многозадачность в PHP

Сколько раз вы разрабатывали веб-приложение, которое имело некоторую функциональность, которая выиграла бы от запуска внешней программы или даже от создания отдельного процесса? Это не то, что вам обычно нравится делать в веб-приложении, потому что вы хотите, чтобы оно работало максимально быстро и эффективно, сохраняя функциональность сайта для конечных пользователей. Итак, как нам получить быстрое, но полнофункциональное приложение, которое может обрабатывать больше, чем обычное приложение, к которому мы привыкли?

Несколько лет назад разработчики веб-сайта столкнулись с аналогичной проблемой. Пользователи загружали слишком много картинок, и все они должны были быть обработаны в своих аккаунтах. Это включало изменение размера, например создание миниатюр или уменьшение размера необработанного изображения, до более подходящего для отображения веб-сайта. Эти картинки в основном состояли из аватаров, миллионы которых перегружали приложение. Команда подумала о решении: иметь сервер, который порождает процессы, выполняющие такие вещи, как обработка изображений, вне приложения веб-сервера. Это привело к Gearman .

Что такое Gearman?

Gearman предоставляет инфраструктуру распределенных приложений для работы с несколькими машинами или процессами. Это позволяет приложениям выполнять задачи параллельно, обрабатывать балансировку нагрузки и вызывать функции между языками. Каркас может быть использован в различных приложениях. Gearman является многопоточным и, как известно, способен выполнять 50 тысяч заданий в секунду.
Некоторые из известных сайтов, использующих C-версию Gearman:
— Digg: более 45 серверов, 400 тысяч рабочих мест в день
— Yahoo: более 120 серверов, 12 миллионов рабочих мест в день

Первоначально Gearman был написан на Perl, но серверы заданий и клиентский API были недавно переписаны на C Эриком Дейем, потому что он хотел повысить производительность.

На рисунке показан тип настройки, которую вы можете использовать для изменения размера изображения. Традиционно, изменение размера изображения было бы полностью реализовано в веб-приложении. Пользователь загружает изображение, и в рамках HTTP-запроса на обслуживание страницы PHP должен будет выполнить преобразование изображения для выполнения изменения размера. Загрузка страницы не будет завершена, пока не будет выполнено изменение размера изображения. Теперь, с Gearman, веб-приложение может запросить изменение размера изображения с помощью клиента Gearman на сервер заданий Gearman. Gearman позволяет вам отделить некоторые функции от вашего веб-приложения, позволяя другим частям вашей среды позаботиться об этом.

Установка и запуск Gearman

Установка очень проста и понятна, если вы просто будете следовать их всеобъемлющему руководству , предполагая, что у вас есть общее представление о ролях, таких как сервер заданий, клиенты и работники; Если у вас возникли проблемы при установке, сообщите нам об этом в комментариях ниже.

Gearman и PHP

Использование Gearman с PHP создает идеальную простую в использовании комбинацию. У вас есть клиент Gearman, который обычно является вашим приложением и представляет собой код, который отправляет задания на сервер заданий Gearman. У вас также есть рабочий компонент, который использует рабочую библиотеку PHP Gearman, чтобы зарегистрировать себя для обработки именованного задания, а затем указывает имя функции для задания. Расширение PHP расширяет процедурный интерфейс, обеспечивая также нативный объектно-ориентированный интерфейс.

Чтобы установить расширение Gearman в PHP, обратитесь к документации вашей ОС. Например, в Ubuntu и Linux Mint это так же просто, как sudo apt-get install php5-gearman . В некоторых системах, однако, вам, возможно, придется собрать его вручную и включить в папку расширений PHP (вы можете узнать, где он находится, просмотрев phpinfo() ), а затем включить его в файл php.ini следующим образом: extension="gearman.so" .

Чтобы проверить, успешно ли установлен Gearman, обратитесь к phpinfo() снова или просто запустите тестовый метод:

 <?php var_dump( gearman_version() ); ?> 

Давайте посмотрим на пример:

 <?php $client= new GearmanClient(); $client->addServer('127.0.0.1'); $client->setCreatedCallback("create_change"); $client->setDataCallback("data_change"); $client->setStatusCallback("status_change"); $client->setCompleteCallback("complete_change"); $client->setFailCallback("fail_change"); $data_array =array('mydata'=>'task'); $task= $client->addTask("reverse", "mydata", $data_array); $task2= $client->addTaskLow("reverse", "task", NULL); echo "DONE\n"; function create_change($task) { echo "CREATED: " . $task->jobHandle() . "\n"; } function status_change($task) { echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() . "/" . $task->taskDenominator() . "\n"; } function complete_change($task) { echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n"; } function fail_change($task) { echo "FAILED: " . $task->jobHandle() . "\n"; } function data_change($task) { echo "DATA: " . $task->data() . "\n"; } Function Client_error() { if (! $client->runTasks()) return $client->error() ; } ?> 

В этом примере клиента создается объект GearmanClient. Затем вызывается метод addServer() API клиента addServer() для добавления сервера, который будет использоваться для клиентского соединения. При желании можно добавить несколько серверов. Пустой аргумент по умолчанию будет localhost — он был явно указан здесь для ясности.

Далее мы настроили несколько обратных вызовов для различных этапов задач — концепция обратных вызовов должна быть знакома каждому промежуточному разработчику.

addTask добавляет задачу для запуска параллельно с другими задачами. addTaskLow добавляет фоновую задачу с низким приоритетом, которая запускается параллельно с другими задачами. Для выполнения работы мы вызываем GearmanClient::runTasks() . Обратите внимание, что для параллельного выполнения задач должно быть достаточно рабочих. Задачи с более низким приоритетом будут выбраны из очереди после задач с более высоким приоритетом.

Вывод

В этом коротком введении в Gearman вы узнали о многозадачности с приложениями PHP. Теперь вы можете реализовать определенные функции, внешние по отношению к вашему веб-приложению, и добиться более высокой производительности, практически не оставляя ничего, кроме остальной части вашей системы.

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