Gearman и PHP 5.4 (5.6): проблемы и решения

    В своей предыдущей публикации автор попытался донести до аудитории интересные возможности, который открывает перед PHP-разработчиком сервер очередей Gearman.
    В публикации был указан алгоритм установки Gearman и расширения для PHP. Речь шла о PHP 5.3. На Debian7 и PHP 5.4 этот алгоритм не работает, не выдавая при этом никаких ошибок ни при установке, ни при работе PHP-скриптов, однако веб-приложения, использующие Gearman, не работают.

    На PHP 5.4 ситуация выглядит так: все устанавливается, все хорошо, все запускается, никаких ошибок. Однако воркеры не добавляют свои задачи на сервер, при этом вот такое
    $worker->addFunction();

    возвращает true.
    Разрыв шаблона.
    Очевидное решение — попробовать установить последнюю версию pecl gearman.
    Но она не устанавливается, как и в ситуации php5.3 требуется библиотека libgearman версии не ниже 1.* и все.
    В чем корень проблемы?
    При установке сервера очередей gearman-job-server в систему также устанавливается та самая библиотека libgearman.
    Но, как выяснилось, в репозиториях Debian версия gearman-job-server (и версия libgearman) — устаревшая относительно репозитория PECL, и попытка установить последнюю версию pecl gearman дает описнные выше результаты.
    Как решить проблему?
    Решение 1. Собрать последнюю версию Gearman из исходников
    Решение 2.Установить чуть более раннюю версию pecl gearman
    Методом проб и ошибок для решения 2 был найден вот такой алгоритм установки сервера очередей Gearman и расширения для PHP 5.4
    aptitude install gearman-job-server
    aptitude install php-pear
    aptitude install make
    aptitude install libgearman-dev
    pecl install gearman-1.0.3
    echo 'extension=gearman.so' > /etc/php5/apache2/conf.d/gearman.ini 
    echo 'extension=gearman.so' >/etc/php5/cli/conf.d/gearman.ini
    


    Все ОК. Но есть важный нюанс:
    в версии для php5.3 вот такое
    
    $worker->addServer();
    

    или
    
    $worker->addServer('localhost');
    

    нормально работает.
    В версии для php5.4 подобные конструкции в коде дают Exception.
    Работает вот такая конструкция
    
    $worker->addServer('127.0.0.1', 4730);
    


    Преодолев указанные выше сложности установки и нюансы использования, получаем результат:


    В заключение. К чему все эти пляски с бубном в прямом смысле слова? Неужели так нужен Gearman? На этот вопрос отвечу «да», главное — работа с сервером очередей меняет логику самого PHP, упрощая многие операции. Автор анонсирует публикацию «Работа с сервером очередей Gearman», в которой будут рассмотрены приемы построения приложений, логика и веб-приложение для мониторинга и управления.

    UPD (03/02/2016): описанный выше способ полностью работоспособен на PHP 5.6 (Debian 8)
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 13

      0
      Я тоже пытался работать с gearman, испытал много мучений. Для реализации «очередей» в конце концов использую redis для небольших проектов и RabbitMQ для крупных.
        0
        В сыром виде — да, можно намаяться
        Есть проблемы:
        — как описанное выше: проблемы установки в систему
        — требуется инструмент для мониторинга работы
        Но когда все это есть, работать с Gearman имхо легко и приятно вне зависимости от масштаба проекта
          0
          Есть RabbitMQ у которого с этим проблем нет вообще и функционала больше в разы и есть хорошие клиентские библиотеки для разных языков.
          Зачем решать проблемы которые уже решены?
        0
        Где же вы раньше были? :)
        Около месяца назад потратил несколько ночей на установку Gearman на Ubuntu Server 12.04 и PHP 5.4, в итоге путём копаний на Stackoverflow и различных форумах пришёл к такой же последовательности.
        P.S. Довольно сильно помог вот этот сайт и дал много новых знаний.
        P.P.S. И да, Gearman великолепен.
          +1
          Я раньше был на php5.3 :)
          P.S. И да, Gearman великолепен.

          присоединяюсь
            0
            а с какими потоками задач вам приходилось сталкиваться?
              0
              работа в несколько потоков (от 4 до 1000) с:
              — API Яндекса (перевод)
              — API Google (AdWods, Analytics, перевод)
              — парсинг ресурсов
              кинул задачи в очередь — сиди кури, смотри как выполняются
                0
                под потоком я имел в виду количество сообщений/задач в секунду.
                  0
                  вопрос, мне кажется, в другой плоскости лежит
                  примеры
                  1) мы запускаем 1000 воркеров. Они все коннектятся к одной БД, начинает сыпать исключениями PDO — много соединений слишком с базой. Быстрее не будет, 5000 воркеров мы не запустим
                  2) мы кинули в очередь 10000 задач на получение и обработку данных с внешнего сервиса. Хорошо бы воркеров побольше, но внешний сервис дает нам 100 коннектов в секунду, не больше (это Гугл). Больше чем 50+ воркеров нам запускать нет смысла, быстрее не поедем

                  Ваш вопрос: ну будет поток например 1к одновременных попыток получения данных. Быстрее чем смогут обработать воркеры не будет, задачи будут становиться в очередь, пока память не закончится

          0
          В Debian Jessie уже всё ставится нормально. Можно попробовать сделать backport.
            0
            В PHP 5.5 у меня работает:
            $ php -r '$gm = new GearmanWorker(); $gm->addServer(); var_dump($gm);';
            object(GearmanWorker)#1 (0) {
            }
            $ php -v
            PHP 5.5.18 (cli) (built: Oct 16 2014 12:21:51)
            Copyright © 1997-2014 The PHP Group
            Zend Engine v2.5.0, Copyright © 1998-2014 Zend Technologies
            with Zend OPcache v7.0.4-dev, Copyright © 1999-2014, by Zend Technologies
              0
              А я когда-то столкнулся с тем, что получал Segmentation fault после:
              <?php
              $client->addTask('taskname', 10);
              $client->runTasks();
              

              Решилось на stackoverflow. Мне нравится Gearman, но описанные вещи портят впечатление.
                0
                Около полутора лет использовали Gearman, и, с ростом нагрузки, столкнулись с тем, что он стал все чаще и чаще тупить и подвисать. Приходилось за ним следить, часто перезагружать.

                С переездом на Rabbitmq эти проблемы исчезли. Выбор однозначен…

                Only users with full accounts can post comments. Log in, please.