Черговий процес у 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 якщо потрібно
&nbsp ;*/
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(), клієнт не відчуває втрат часу і скрипт завершується не чекаючи кінця.

2164 0

Відгуки

Поки немає жодного відгуку. Станьте першим!
Тільки авторизовані користувачі можуть залишати відгуки Вхід

Схожі статті

Створити та завантажити CSV на PHP

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

Шаблони ImageCMS 4.10-4.12.1

Останні шаблони від ImageCMS 4.12, для завантаження потрібна авторизація.