AMQP теперь и в PHP

    типа Введение
    Протокол AMQP хорошо был описан в статьях AMQP по русски, RabbitMQ: Введение в AMQP AMQP — практика использования и мне не хотелось бы повторяться.

    AMQP используется в серверах очередей: ZeroMQ, ActiveMQ, RabbitMQ.

    Преимущество RabbitMQ перед прочим свободным ПО:
    — более полно представлен протокол,
    — поддерживает кластер,
    — реализован как многопоточный сервер, высокая производительность

    Широкое распространение AMQP в WEB разработках разработках сдерживается двумя причинами: отсутствием необходимых навыков (практики) его использования и малой клиентской поддержкой. В основном есть клиенты на языках с, java, python, с#. Большая популярность РНР в WEB разработках жалала бы видеть и свой AMQP-клиент.

    В настоящее время ращработаны следующие PHP клиенты:
    php-amqplib Протокол реализован в достаточно полном объеме на PHP. Лично у меня его запустить не удалось, виснет на классе соединения с AMQP брокером. Если кто сможет его запустить, буду признательным, если поделитесь опытом.

    php-amqp — Расширение, использующее клиентскую библиотеку RabbitMQ-C. Реализована только возможность публикации сообщений.

    php-rabbit — Расширение, использующее клиентскую библиотеку RabbitMQ-C hg.rabbitmq.com/rabbitmq-c. Реализован протокол в достаточном для практике использования. Развивается и поддерживается мною, так что готов к конструктивному диалогу.

    После представления РНР-Rabbit сообществу RabbitMQ, сделали предложение русскоязычному Сообществу RabbitMQ создать свою русскоязычную группу обсуждения, в которую входит один из разработчиков RabbitMQ — Дмитрий Самовский

    Адресс группы http://groups.google.com/group/rabbitmq_rus Желающим присоединиться Wellcome!!!
    Пример использования:
    // queue declare queue.php
    $rabbit = new Rabbit(); // default connection localhost:5672
    //user=guest psw=guets vhost="/"
    $rabbit->queue("q_test"); // declare queue "q_test"


    // queue declare queue2.php
    $rabbit = new Rabbit(); // connection
    $rabbit->queue("q_test2"); // declare queue "q_test2"

    // exchange declare exchange.php
    $rabbit = new Rabbit(); // connection
    $rabbit->exchange('e_test', "topic"); // topic exchange declare
    $rabbit->bind('e_test','q_test','key_test.t1'); // bind exchange to queue "q_test" by key="key_test"
    $rabbit->bind('e_test','q_test2','key_test.t2'); // bind exchange to queue "q_test2" by key="key_test2"

    // publishing to queue1 publish.php
    $msg = array(
    'message1','message2','message3','message4'
    );
    $rabbit = new Rabbit(); // connection
    foreach ( $msg as $item ) // // publishing to queue1
    $rabbit->publish('e_test','key_test.t1',$item);

    // publishing to queue2
    foreach ( $msg as $item ) // // publishing to queue2
    $rabbit->publish('e_test','key_test.t2',$item."01");

    // reading all messages from queue: consume.php
    $rabbit = new Rabbit(); // connection
    $count=$rabbit->queue("q_test");
    $res =$rabbit->consume("q_test", $count)
    var_dump($res);
    // $res is array of messages;

    // reading some messages from queue: queueItems.php
    $rabbit = new Rabbit(); // connection
    $count=$rabbit->queue("q_test2");

    for ( $i=0; $i<$count;$i++ ){
    $res = $rabbit->queueItem("q_test2" );
    print_r( $res );
    }

    типа Эпилог
    Следующий пост будет посвящен практическому применению и особенностям расширения

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 6 247 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 15

      +1
      Хм, интересная штука.

      Но вот после просмотра кода этих библиотек пользоваться ими что-то не очень то и хочется.
        0
        А по поводу Rabbit, в examples/consume.php на пятой строчке не хватает точки с запятой ;)
          0
          ок

          спасибо
          0
          именно моих или родных от раббита?
            0
            php-amqplib полон костылей различных. Особенно забавно выглядит динамическое создание атрибутов класса. php-amqp — не смотрел. А по поводу Rabbit'а — собственно отпугивает pecl. Хотелось бы нормальный php с комментами, что бы его смогла подхватить ide, потому как даже файлик API.txt для беглого просмотра слегка тяжеловат для понимания. Да и по сравнению с php-amqplib выглядит как-то бедновато, куда-то делать та обещанная гибкость ;)
              0
              идею понял

              постараюсь доработать до более полного объектного АПИ
              как мне ниже уже предложил Wott
              хотелось как проще, код работоспособен,
              чуть позже изложу примеры.

              наверно много переделки будет в объектную модель.
          +1
          Извините, но у вас есть небольшая неточность, ActiveMQ не поддерживает протокол AMQP, его поддержку тока начали реализовывать, да и то приостановили

          http://activemq.apache.org/amqp.html

          ActiveMQ has code in the sandbox for implementing AMQP on ActiveMQ. However, the development of this code has been paused until there is further user and developer interest. Additionally, the AMQP standard is still going through major changes, and new release of the standard will made made soon (0.10). The wealth of clients available for ActiveMQ, means that there has been little need for AMQP development.

            0
            спасибо
            то-то мне казалось, что поддерживает…
            хотел указать, что существует такой сервер
            0
            Как-то немного нелогично построено API.
            Зачем тащить строковые имена через весь код? для этого еще неандертальцы использовали хэндлеры.
            Если уж обьектный API, то логично что и хэндлеры тоже будут объектами — queue, exchange.
              +1
              И еще, API лучше описать в виде «хедера» — декларативного описания класса, свойств и методов с PHPDoc описаниями и типизацией. Очень удобно для IDE в частности.
                0
                ну, АПИ описано в коде по типу как в PECL
                  0
                  думал над расширением,
                  возможно, в следующей версии сделаю модель объектной
                  0
                  согласен,

                  В рекомендациях к разработке АПИ тоже предлагают их сделать объектами,
                  но, решил съэкономить на коде для решения чисто практических задач.

                  +1
                  framework.zend.com/manual/ru/zend.queue.html
                    0
                    раббит как впрочем AMQP там не поддерживается
                    а писать адаптер к ZF — это геморойно,
                    это почти тоже самое что и нативно реализовать сам протокол AMQP
                    проще написать адаптер на мой экстеншен.

                    согласен — эксентеш требует доработки
                    как уже высказали выше.

                    у меня реализован не весь спектр возможностей протокола

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое