Фоновый процесс очереди в Php с Gearman

Про установку Gearman Job Server - можно прочитать здесь.

Если все получилось согласно инструкциям по установке Gearman, то можно продолжить.

Начну с того, что для правильной работы потребуется создать некий воркер (worker), с которым будет общаться клиент (client) на Php, ставя свои задачи в очередь в фоновом режиме или дожидаясь ответа.

Создам самый простой пример на двух файлах, который позволит понять логику работы Gearman. Наш полигон будет состоять из двух файлов:

Gearman+php пример

server.php - файл в котором мы создадим worker, который будет обрабатывать все запросы. В данном примере он будет доступен по локальной ссылке : http://test1.loc/server.php

client.php - файл в котором мы будем ставить задачи для созданного воркера. Это будет наш клиент, которому будет требоваться ставить фоновые задачи. В данном примере он будет доступен по локальной ссылке : http://test1.loc/client.php

1. Рассмотрим часть ожидающего задачи воркера server.php:

<?php

$gmw = new GearmanWorker();

/**
 * Пока рассмотрим инициализацию addServer() поумолчанию
 * Этот метод нужен для объевляния, на какой машине работает этот worker
 */
$gmw->addServer();

/**
 * log_client - со стороны клиента испольщовать этот alice
 * work_log - функция, на которую будет кидать воркер, если
 * на alice log_client придет что-то.
 */
$gmw->addFunction('log_client', 'work_log');

/**
 * Специально сделано зациеливание
 * Если объявить просто $gmw->work(), то задача завершится сразу же
 * после выполнения. Тоесть сработает только раз.
 */
while($gmw->work());

/**
 * Вписывает логи в файл
 * @param JSON $param - Принимает только строку, поэтому передаем в json если нужно
 */
function work_log($param) {
    /*Достает данные передаваемые клиентом*/
    $data = $param->workload();
    
    /**
     * Искуственно делаем нагрузку, чтобы была имитация большого ожидания.
     * Тут мы увидем, что скрипт клиента не будет ждать окончания 100 секунд,
     * а повесит задачу и забудет про нее.
     */
    for ($i = 0; $i < 100; $i++) {
        sleep(1);
        file_put_contents('log.txt', $data, FILE_APPEND);
    }
    
}

2. Рассмотрим сторону клиента, который шлет задачи воркеру client.php:

<?php

$client = new GearmanClient();
/**
 * Объявляем сервер, на котором нас ждет воркер. Пока все настройки поумолчанию
 */
$client->addServer();

/**
 * doBackground() - вешаем задачу не ожидая завершения.
 * log_client - alice на функцию work_log() из server.php
 *
 * второй параметр "Тестовый ЛОГ. \r\n" - уйдет в фкнкцию work_log();
 */
$client->doBackground('log_client', "Тестовый ЛОГ. \r\n");    
   

Вам приведен самый простой действующий прототип задачи поставленой на стороне Php в фоновом режиме.

3. Как это работает?

Схема работы сервиса Gearman проста. В server.php находится сам обработчик. Пока что его будем запускать в браузере, но в дальнейшем ссылкой http://test1.loc/server.php. Запрос браузера станет в постоянное ожидание из-за строк while($gmw->work());

Если запустить $gmw->work(); не в цикле, то после запуска клиентской части, скрипт отработает 1 раз и завершится.

В отдельном окне запускаем client.php ссылкой http://test1.loc/client.php. Как можно увидеть, запустится функция work_log() из server.php и будет писать слово передаваемое клиентом в файл log.txt в течении 100 секунд, 100 раз.

Если бы это делалось без gearman, то скрипт ожидал бы конца 100 секунд. Но благодаря фоновой задачи doBackground(), клиент не ощущает потерь времени и скрипт завершается не ожидая конца.

2162 0

Комментарии

Пока нет ни одного отзыва. Оставьте отзыв первым
Только авторизованные пользователи могут оставлять комментарии Вход

Похожие статьи

Создать и скачать CSV на PHP

Рассмотрим возможность быстрого создания CSV файла с автоматическим скачиванием файла. Рассмотрим формирование, разделители и header для возможности скачать файл.