Рубрики
Uncategorized

PHP – реализация публикации и подписки на сообщения redis

Автор оригинала: David Wong.

Основное введение

Опубликовать/подписаться (означает опубликовать, подписаться) – это функция публикации и подписки

  • В системах, основанных на событиях, pub/sub является широко используемой моделью коммуникации. Он использует события в качестве основного механизма связи для обеспечения режима взаимодействия, требующегося для крупномасштабных систем: подписчик (например, клиент) выражает событие или класс событий, которые он заинтересован в получении в форме подписки на события; издатель (например, сервер) может отслеживать события, в которых заинтересован подписчик, уведомляя соответствующих подписчиков.
  • Издателю сообщений, то есть клиенту публикации, не нужны эксклюзивные ссылки. Вы можете использовать ту же ссылку redis client для других операций (например, incr) при публикации сообщений
  • Подписчику сообщения, то есть клиенту подписки, нужны эксклюзивные ссылки. То есть во время подписки клиент redis не может выполнять другие операции. В это время клиент ожидает сообщения “опубликовать” блокирующим способом. Это хорошо понятно. Поэтому стороне подписчика необходимо использовать отдельную ссылку, даже в дополнительном потоке.

При использовании банковской карты для потребления банки часто сообщают пользователям информацию о транзакциях через wechat, SMS или электронную почту, что является режимом публикации и подписки. Здесь публикация-это публикация информации о транзакциях, а подписка-это все каналы. Это очень распространено в практической работе, и redis поддерживает такой режим.

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

Реализация терминала

Подписка, канал-это новости о выпуске “чата”

реализация кода

подписываться. php

connect("127.0.0.1",6379);
//$redis->setOption(Redis::OPT_ READ_ Timeout, - 1); // redis mode does not time out. Recommended

$redis - > subscribe (['chan '],'callback'); // callback is the name of the callback function
//$redis - > subscribe (['chan '], array (New testcall(),'callback')); // if the callback function is a method name in the class, write as follows

//Callback function, write processing logic here
function callback($instance, $channelName, $message)
{
         echo $channelName, "==>", $message, PHP_EOL;
         
         //$instance is the redis instance object created above. In the callback function, the default parameter is, so there is no need to pass a parameter. Except for the four commands, subscribe, psubscribe, unsubscribe and punsubscribe, other commands cannot be used
         //If you want to use other commands in redis, do this
         $newredis = new Redis();
        $newredis->connect("127.0.0.1", 6379);
        echo $newredis->get('test') . PHP_EOL;
        $newredis->close();
        
          //Different business logic can be processed according to $channelname and $message
          switch($chan) {
               case 'chan-1':
                  ...
                  break;
         
               case 'chan-2':
                              ...
                   break;
           }
           
           switch($message) {
               case 'msg1':
                  ...
                  break;
         
               case 'msg2':
                              ...
                   break;
           }
    
}

php

connect("127.0.0.1",6379);

$redis->publish('chan','this is a message');

Введение в код

  1. subscribe.php Не устанавливайте тайм-аут в

Метод 1: набор ini_(“тайм-аут по умолчанию для сокета”, -1);

Способ 2: $redis – > setoption (redis:: OPT)_ ВРЕМЯ ОЖИДАНИЯ ЧТЕНИЯ, -1);

Если тайм – аут не установлен, сообщение об ошибке появится через 60 секунд

PHP Fatal error:  Uncaught RedisException: read error on connection to 127.0.0.1:6379 in subscribe.php:6

Режим 1 реализуется путем временного изменения значения конфигурации ini, тайм-аут по умолчанию для сокета по умолчанию составляет 60 секунд_ Тайм-аут-это параметр тайм-аута потока сокетов, то есть весь процесс потока сокетов от создания до передачи и закрытия должен быть завершен в течение времени, установленного этим параметром. Если это не может быть завершено, PHP автоматически завершит работу сокета и вернет предупреждение.

Второй способ-изменить элемент конфигурации redis, чтобы он действовал только при подключении redis. По сравнению с режимом 1 это не окажет неожиданного влияния на другие методы.

Массовая подписка

Redis psubscribe поддерживает пакетную подписку с помощью сопоставления шаблонов

$redis – > подписка на подписку ([“Мой * “],”подписка на подписку”);//функция обратного вызова записывает имя функции, возможно, $redis – > подписка на подписку ([“Мой*”], массив (Новый тестовый вызов (), “подписка на подписку”));//функция обратного вызова является методом в классе, и имя класса записывается с помощью вашего собственного определенного класса

$redis – > подписка на подписку ([“Мой * “],”подписка на подписку”);//функция обратного вызова записывает имя функции, возможно, $redis – > подписка на подписку ([“Мой*”], массив (Новый тестовый вызов (), “подписка на подписку”));//функция обратного вызова является методом в классе, и имя класса записывается с помощью вашего собственного определенного класса

connect("127.0.0.1",6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

//Matching method 1: publish available $redis - > publish ('mymest ','This is a message');
//$redis->psubscribe(['my*'],'psubscribe');    

//Matching method 2: publish available $redis - > publish ('mydest ','This is a message');
//$redis->psubscribe(['my?est'],'psubscribe');

//Matching method 3: publish with $redis - > publish ('myaest ','This is a message'); or $redis - > publish ('myeest ','This is a message');
$redis->psubscribe(['my[ae]est'],'psubscribe');

function psubscribe($redis, $pattern, $chan, $msg) {
      echo "Pattern: $pattern\n";
      echo "Channel: $chan\n";
      echo "Payload: $msg\n";
}

Правила сопоставления шаблонов

Он поддерживает следующие типы, такие как Hello:

h?llo подписывается на “привет, привет и привет”, h*llo подписывается на “привет” и “привет”, h[ae]llo подписывается на “привет” и “привет”, но специальные символы hillo не используются для побега

Введение в метод PubSub

публичная функция pubsub (ключевое слово$, аргумент$)

PubSub получает информацию о пабе/подсистеме. Ключевое слово $может использоваться как “каналы”, “numsub” или “numpat”. Данные, возвращаемые разными ключевыми словами, отличаются

*$redis > PubSub ('channels'); // all channels gets all channels and returns an array
     *$redis - > PubSub ('channels', '* pattern *'); // just channels matching your pattern to return channels that match the matching pattern
     *$redis - > PubSub ('numsub ', array ('chan1','chan2 '); // get subscriber counts for' chan1 'and' chan2 '// returns the number of each subscription channel and returns an array
     *$redis - > PubSub ('numpat '); // get the number of pattern subscribers to get the number of subscriptions in pattern matching mode, i.e. $redis - > psubscribe (['My [AE] EST'],'psubscribe '); the returned quantity is 1, $redis - > subscribe (['chan'],'callback '); this method cannot get the number, so the returned number is 0

справочные ресурсы:

Режим подписки на публикацию Redis