Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i Фоновый процесс очереди в Php с Gearman / ~#root -i
  • RU
  • UA
  • EN
  • Создать интернет-магазин
  • Документация
  • Блог
    • Unix-подобные ОС
    • Php
    • MySQL
    • JavaScript
    • Менеджеры пакетов
    • Docker
    • Seo
  • Вспомогательные сервисы
    • Короткие ссылки
    • Oбмен просмотрами YouTube
  • Вход
  • Регистрация
  • Главная
  • Php
  • Фоновый процесс очереди в Php с Gearman

Фоновый процесс очереди в 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(), клиент не ощущает потерь времени и скрипт завершается не ожидая конца.

root-i
19 Мая 18
1280
0
Теги
Gearman Php 5.6
Поделиться

Комментарии

Имя
Электронная почта
Рейтинг
Отзыв

Другие статьи из категории

25 Апреля 2022

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

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

19 Июня 2019

Шаблоны ImageCMS 4.10-4.12.1

Последние шаблоны от ImageCMS 4.12, для скачивания нужна авторизация.

26 Января 2019

Долгое хранение корзины в интернет-магазине

Рассмотрим варианты популярные варианты хранения товаров в корзине в интернет-магазине. Обозначим плюсы и минусы таких хранений. Рассмотрим варианты долгосрочного хранения корзины.

17 Января 2019

Ключ-лицензия для ImageCMS 4.9-4.12.1 Pro и Pre

Создание ключа для imageCMS 4.9-4.12.1 Pro и Pre. Для получения следует авторизироваться.

07 Декабря 2018

$_SERVER['DOCUMENT_ROOT'] в CLI или Cron

При запуске скрипта с консоли отсутствует DOCUMENT_ROOT в $_SERVER. Попытаемся обойти это своими путями, отловить директорию файла.

31 Октября 2018

Анализ нагруженных частей Php кода с помощью xhprof

После разработки какого-либо инструмента на PHP, становится вопрос, насколько созданный код ресурсный и какие элементы он затрагивает еще. Рассмотрим установку xhprof, настройку и рассмотрим способы работы с xhprof.

18 Июля 2018

Группировка условий в запросе ORM Propel (condition, combine)

Разберем возможность объединения условий в запросе по группам в Propel. Рассмотрим пример фильтрации по полям с помощью ->condition() и ->combine().

14 Июня 2018

Авторизация 1С на сайте PHP_AUTH_USER на CentOS apache

Столкнулся с проблемой авторизации 1с на сайте. Сервер почему то не принимал от нее параметр PHP_AUTH_USER и PHP_AUTH_PW. Рассмотрим подробнее решение и обход данных параметров в $_SERVER .

Категории

  • Unix-подобные ОС
  • Php
  • MySQL
  • JavaScript
  • Менеджеры пакетов
  • Docker
  • Seo

Теги

Ubuntu 14.04 (17) Софт (11) Gearman (3) Сервисы (2) Framework (1) MVC (1) Php 5.6 (16) Cli (3) Propel (3) ORM (3) JavaScript (5) Css (1) Composer (4) Docker (3) Seo (4) MySQL (5) docker-compose (2) CentOS (1) 1С (1) Memcache (1) Memcached (1) Php 7 (6) Анализ (2) Ubuntu 18.04 (13) MySQL 5.7 (4) Генерация (2) Bower (1) Npm (1) NodeJs (3) Gulp (1) ImageCMS (2) Базы (1) JQuery (1) Сниппет (1) Apache (1) Cron (1)

Последние комментарии

alex, я вижу 2 причины почему так может быть. Не в...
root-i
04.07.22
Сделал все так как написано в статье, не работает.
alex
04.07.22
Как вариант это может происходить из-за неизвестно...
root-i
21.01.22
Чтобы убрать ошибку Uncaught TypeError: $ is not a...
wlad2.ru
11.01.22

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

Благодарность, на продолжение работы сайта:
Контакты

Telegram Viber Mail

Поиск по сайту

  • Вход
  • Регистрация

Сайт работает на chmod -R