Ответы пользователя по тегу PHP
  • Как заставить работать Swoole сокет сервер в связке с RabbitMQ?

    @acerrusm Автор вопроса
    Есть новости по поводу Swoole + RabbitMQ. Добился от разработчика хоть какого то пояснения ТУТ. Но опять же, пример кода который он выложил у меня не работает. Пробовал сначала на виртуалке, потом на простом ubuntu сервере, но тщетно. Хотя картина более или менее проясняется.

    Написал разработчику о проблеме, но он пока молчит. Потому хочу попросить тех, кто заинтересован, попробовать у себя запустить swoole вместе c rabbitmq. Вдруг все таки я криворук и пример кода рабочий. Если вы столкнетесь с такой же проблемой, то обязательно напишите об этом на гитхабе.

    Шаг 1.
    Установите Swoole
    Если будете устанавливать Swoole, то устанавливайте с помощью команды:
    sudo pecl install swoole-2.1.1

    Не рекомендую устанавливать компилируя, иначе потом запаритесь удалять т.к. uninstaller не прилагается и команда "make uninstall" не сработает.

    Обязательно должна быть версия 2.1.1. т.к. в версиях ниже нет coroutine.

    Шаг 2:
    Установите IDE-helper, что бы было приятнее работать с методами и классами

    Шаг 3:
    Установите phpAMQP. Это репозиторий который swoole форкнул себе и добавил поддержку Swoole. Т.е. команда
    composer require php-amqplib/php-amqplib
    установит только phpAMQP БЕЗ поддержки Swoole и вам нужно будет ручками добавить 2 файлика:
    1) php-amqplib/PhpAmqpLib/Connection/AMQPSwooleConnection.php
    2) php-amqplib/PhpAmqpLib/Wire/IO/SwooleIO.php

    Шаг 4:
    Установите RabbitMQ

    Удачи!

    UPDATE: на StackOverflow помогли с решением: https://stackoverflow.com/questions/49226659/swool...

    Проблема была в том, что в worker.php я использовал экземпляр класса swoole_http_client, который как оказалось работает асинхронно.

    Для синхронной работы потребуется WebSocketClient класс, который можно найти тут

    Далее заменить
    $cli = new \swoole_http_client('0.0.0.0', 2345);
    
        $cli->on('message', function ($_cli, $frame) {
            var_dump($frame);
        });
    
        $cli->upgrade('/', function($cli)
        {
            $cli->push('This is the message to send to Swoole server');
            $cli->close();
        });

    на
    $client = new WebSocketClient('0.0.0.0', 2345);
    $client->connect();
    $client->send('This is the message to send to Swoole server');
    $recv = $client->recv();
    print_r($recv);
    $client->close();


    Все.
    Ответ написан
    4 комментария