RabbitMQ: отложенные сообщения

Задача: организовать доставку сообщения «слушателю» спустя какое-то время, а не сразу

Решение: одним из способов реализации является использование модуля rabbitmq-delayed-message-exchange.

Установка для Ubuntu:

  1. Скачать подходящую версию модуля для версии вашего RabbitMQ в формате *.ez
  2. Положить его в папку (в моём случае) /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.9/plugins
  3. Включить плагин
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

Использование:

Пример постановки в очередь:



define('WUO_ROOT', dirname(__FILE__));

require_once WUO_ROOT.'/../vendor/autoload.php';
// загружаем классы
spl_autoload_register(function ($class_name) {
    require_once WUO_ROOT.'/../class/'.$class_name.'.php';
});

//Необходимые классы
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

//Создаем соединение
$connection = new AMQPStreamConnection('22.357.184.20', 5672, 'цсцаучсцу', 'сысыуксыук');

//Берем канал и декларируем в нем новую очередь, первый аргумент - название
$channel = $connection->channel();

// Очередь
$channel->queue_declare('wss_messages', false, true, false, false);

// Отправляю 5 сообщений
for ($i=0;$i<6;$i++){
    $msg = new AMQPMessage("Hello All №".$i, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);		
    $msg->set('application_headers', new AMQPTable(['x-delay' => 5000]));
    $channel->basic_publish($msg, 'main');
};
echo "Messages sended\n";
$channel->close();
$connection->close();

Пример слушателя:



define('WUO_ROOT', dirname(__FILE__));
require_once WUO_ROOT.'/../vendor/autoload.php';
// загружаем классы
spl_autoload_register(function ($class_name) {
    require_once WUO_ROOT.'/../class/'.$class_name.'.php';
});

//Необходимые классы
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

//Создаем соединение
$connection = new AMQPStreamConnection('22.53.14.120', 5672, 'уцмцу', 'мцукмцукм');
$channel = $connection->channel();

$channel->queue_declare('wss_messages', false, true, false, false);

$callback = function ($msg) {
        echo $msg->body;
        echo PHP_EOL;
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('wss_messages', '', false, true, false, false, $callback);

while (count($channel->callbacks)) {
        $channel->wait();
}
$channel->close();
$connection->close();

Отправка PUSH уведомлений в приложение IOS

Задача: в приложение на IOS отправить push уведомление из PHP

Решение:

public function SendPushIOS($token,$title,$message){     
     $rs=false;
     $notification_payload = [
        "aps" => [
            "alert" => [
                //"title" => "Зарядись!",
                "body" => $message,
               // "action-loc-key" => "PLAY"
            ],
            "badge" => 0,
            "sound" => "bingbong.aiff"
        ]
     ];     
        $token_key = $this->server_key_ios;
        //echo "!! token_id IOS: $this->server_token_id_ios\n";
        $jwt_header = [
                'alg' => 'ES256', 
                'kid' => $this->server_token_id_ios
        ];
        //echo "!!team_id:$this->server_team_id_ios\n";
        $jwt_payload = [
                'iss' => $this->server_team_id_ios, 
                'iat' => time()
        ];
        $raw_token_data = self::b64($jwt_header, true).".".self::b64($jwt_payload, true);
        $signature = '';        
        openssl_sign($raw_token_data, $signature, $token_key, 'SHA256');
        $jwt = $raw_token_data.".".self::b64($signature);
        // send push
        $request_body = json_encode($notification_payload);
        $endpoint = 'https://api.push.apple.com/3/device';
        $url = "$endpoint/$token";
        $ch = curl_init($url);
        //echo "!!server_bandle_id_ios:$this->server_bandle_id_ios\n";
        curl_setopt_array($ch, [
                CURLOPT_POSTFIELDS => $request_body,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
                CURLOPT_HTTPHEADER => [
                        "content-type: application/json",
                        "authorization: bearer $jwt",
                        "apns-topic: $this->server_bandle_id_ios"
                ]
        ]);
        $result_curl=curl_exec($ch);
        $result = json_decode($result_curl);

        if (is_null($result)) {
            $log= new TLog($this->api);
            $log->InsertLogBoiler([
                "source_id"=> TLog::S_Messages,
                "comment"=>"Ошибка отправки PUSH IOS",
                "raw_package"=>curl_error($ch).$result_curl,
                "reason"=> TLog::R_Error
            ]);           
        } else { 
                if ((int)$result>0){
                //if ($result->success>0){
                  $rs=true;  
                };
        };
        

        curl_close($ch);        
     return $rs;
    }
 public function b64($raw, $json=false){
            if($json) $raw = json_encode($raw);
            return str_replace('=', '', strtr(base64_encode($raw), '+/', '-_')); 
    }   

Отправка PUSH уведомлений в приложение Android из PHP

Для того чтобы отправлять пуш уведомления, необходимо получить ключ установки приложения и знать «ключ сервера». Более подробная информация в консоли Firebase

public function SendPushAndroid($server_key,$token,$title,$message){
        $data = json_encode([
            "to" => $token,
            "notification" => [
                "body" => $message,
                "title" => $title,
                "icon" => "ic_launcher"
            ]
        ]);

        $url = 'https://fcm.googleapis.com/fcm/send';
        $server_key = $server_key;
        $headers = array('Content-Type:application/json','Authorization:key='.$server_key);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $result = curl_exec($ch);
        var_dump($result);
        if ($result === FALSE) {
            die('Oops! FCM Send Error: ' . curl_error($ch));
        }
        curl_close($ch);        
    }    

HelpDesk-z: класс для взаимодействия по API

Документация: https://docs.helpdeskz.com/en/latest/

С моими правками: https://github.com/donpadlo/helpdeskz-dev

В принципе эта ХелпДеск система уже умеет работать с API, осталось дело за малым — обернуть это всё в удобный класс для работы:

» Читать далее

Особенности установки helpdesk-z

К сожалению в руководстве по установке, процесс описан очень коротенько, и очень часто установка сводится к выводу сообщения:

Whoops! We seem to have hit a snag. Please try again later…

Чтобы улучшить информативность фреймворка, что же ему таки не хватает, можно временно добавить в index.php строчку:

define('ENVIRONMENT', 'testing');

Но! В этом случае после успешного прохождения всех шагов инсталляции, фремворк будет пытаться проходить тесты и писать результаты в SQLite3, что нам не нужно. Потому не забудьте эту строчку удалить.

Для локализации, достаточно скачать необходимый язык из https://github.com/helpdesk-z/translations, и в настройках поменять локаль на нужную

1 8 9 10 11 12 29