Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan PHP untuk terus mendengar langganan mesej Redis dan memproses mesej daripada berbilang pelayan?

Bagaimana untuk menggunakan PHP untuk terus mendengar langganan mesej Redis dan memproses mesej daripada berbilang pelayan?

WBOY
WBOYasal
2023-09-05 12:45:33827semak imbas

Bagaimana untuk menggunakan PHP untuk terus mendengar langganan mesej Redis dan memproses mesej daripada berbilang pelayan?

Cara menggunakan PHP untuk terus memantau langganan mesej Redis dan memproses mesej daripada berbilang pelayan

Dengan pembangunan aplikasi Internet yang berterusan, push mesej masa nyata telah menjadi keperluan untuk banyak aplikasi. Sebagai pangkalan data cache berprestasi tinggi, model penerbitan/langganan Redis boleh memenuhi permintaan ini dengan baik. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melanggan dan memproses mesej Redis, dan menyelesaikan masalah berbilang pelayan mendengar mesej pada masa yang sama.

Pertama, kita perlu memastikan bahawa pangkalan data Redis dan sambungan Redis untuk PHP dipasang dan dikonfigurasikan dengan betul. Jika sambungan Redis dan Redis tidak dipasang, anda boleh merujuk kepada dokumentasi yang berkaitan untuk memasangnya.

Seterusnya, kami mengambil aplikasi bilik sembang ringkas sebagai contoh untuk menunjukkan cara menggunakan PHP untuk terus memantau langganan mesej Redis dan memproses mesej daripada berbilang pelayan.

  1. Buat fail PHP bernama subscriber.php untuk melanggan mesej Redis.
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->subscribe(['chat-room'], 'processMessage'); // 订阅名为chat-room的频道,并指定回调函数processMessage

function processMessage($redis, $channel, $message)
{
    // 处理接收到的消息,例如将消息推送给聊天室的在线用户
    echo "Received message from channel {$channel}: {$message}
";
    // 在这里实现将消息推送给聊天室的在线用户的逻辑
}
    subscriber.php,用于订阅Redis消息。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->publish('chat-room', 'Hello, world!'); // 向名为chat-room的频道发布一条消息
  1. 创建一个PHP文件,命名为publisher.php,用于向Redis发布消息。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->subscribe(['chat-room'], 'processMessage');

function processMessage($redis, $channel, $message)
{
    // 处理接收到的消息,例如将消息推送给聊天室的在线用户
    echo "Received message from channel {$channel}: {$message}
";
    
    // 向其他服务器发送消息
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://other-server/process-message.php');
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, [
        'channel' => $channel,
        'message' => $message,
    ]);
    curl_exec($curl);
    curl_close($curl);
}

通过上述代码,我们实现了一个简单的 Redis 消息订阅和发布功能。可运行subscriber.php来监听Redis的消息,并运行publisher.php向Redis发布一条消息。当收到消息时,processMessage回调函数会被调用,我们可以在该函数中实现对消息的处理逻辑。

然而,如果我们使用多台服务器来处理消息,每台服务器上都运行一个subscriber.php来持续监听Redis的消息,就会导致消息被多次处理,从而出现重复操作的问题。

为了解决这个问题,我们可以借助Redis的PUBLISH/SUBSCRIBE功能。我们可以创建一个额外的服务器,专门用于订阅Redis消息,并将处理消息的逻辑转发给其他服务器。下面是修改后的代码示例:

  1. 修改subscriber.php文件。
<?php

$channel = $_POST['channel'];
$message = $_POST['message'];

// 在这里实现将消息推送给聊天室的在线用户的逻辑
echo "Received message from channel {$channel}: {$message}
";
  1. 创建一个新的PHP文件,命名为process-message.php,用于处理接收到的消息。
rrreee

在上述代码中,我们修改了 subscriber.php 文件,添加了向其他服务器发送消息的逻辑。当收到消息时,它将通过 HTTP POST 请求将消息发送到其他服务器的 process-message.php 文件,后者负责进一步处理接收到的消息。

通过这种方式,我们可以实现多台服务器同时监听Redis消息,并确保每条消息只被处理一次。只要其他服务器的 process-message.phpBuat fail PHP bernama publisher.php untuk menerbitkan mesej kepada Redis. rrreee

Melalui kod di atas, kami telah melaksanakan fungsi langganan dan penerbitan mesej Redis yang mudah. Anda boleh menjalankan subscriber.php untuk mendengar mesej Redis, dan menjalankan publisher.php untuk menerbitkan mesej kepada Redis. Apabila mesej diterima, fungsi panggil balik processMessage akan dipanggil dan kami boleh melaksanakan logik pemprosesan mesej dalam fungsi ini.

Walau bagaimanapun, jika kami menggunakan berbilang pelayan untuk memproses mesej, dan setiap pelayan menjalankan subscriber.php untuk memantau mesej Redis secara berterusan, mesej itu akan diproses beberapa kali, mengakibatkan operasi berulang. 🎜🎜Untuk menyelesaikan masalah ini, kita boleh menggunakan fungsi PUBLISH/SUBSCRIBE Redis. Kami boleh mencipta pelayan tambahan khusus untuk melanggan mesej Redis dan memajukan logik untuk memproses mesej ke pelayan lain. Berikut ialah contoh kod yang diubah suai: 🎜🎜🎜Ubah suai fail subscriber.php. rrreee
    🎜Buat fail PHP baharu bernama process-message.php untuk memproses mesej yang diterima.
rrreee🎜Dalam kod di atas, kami mengubah suai fail subscriber.php dan menambahkan logik untuk menghantar mesej ke pelayan lain. Apabila mesej diterima, ia akan menghantar mesej melalui permintaan HTTP POST ke fail process-message.php pelayan lain, yang bertanggungjawab untuk memproses selanjutnya mesej yang diterima. 🎜🎜Dengan cara ini, kami boleh melaksanakan berbilang pelayan untuk memantau mesej Redis pada masa yang sama dan memastikan setiap mesej diproses sekali sahaja. Selagi fail process-message.php pelayan lain boleh memproses mesej dengan betul, kami boleh melaksanakan logik pemprosesan mesej di dalamnya. 🎜🎜Pada ketika ini, kami telah menyelesaikan langganan dan pemprosesan menggunakan PHP untuk memantau mesej Redis secara berterusan, dan menyelesaikan masalah berbilang pelayan memantau mesej pada masa yang sama. Atas dasar ini, anda boleh mengembangkan dan mengoptimumkan kod mengikut keperluan anda sendiri untuk mencapai fungsi yang lebih kompleks. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan PHP untuk terus mendengar langganan mesej Redis dan memproses mesej daripada berbilang pelayan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn