Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah PHP terus mendengar langganan mesej Redis dan memprosesnya?

Bagaimanakah PHP terus mendengar langganan mesej Redis dan memprosesnya?

WBOY
WBOYasal
2023-09-05 17:12:25626semak imbas

Bagaimanakah PHP terus mendengar langganan mesej Redis dan memprosesnya?

Bagaimanakah PHP boleh terus mendengar langganan mesej Redis dan memprosesnya?

Redis ialah pangkalan data dalam memori sumber terbuka yang digunakan secara meluas dalam cache, baris gilir, langganan mesej dan senario lain. Dalam pembangunan sebenar, kami sering perlu melaksanakan pemantauan dan pemprosesan berterusan mesej Redis. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melanggan dan memproses mesej Redis, dan memberikan contoh kod.

Pertama sekali, kita perlu pastikan sambungan Redis telah dipasang Anda boleh memasang sambungan Redis dengan arahan berikut:

$ pecl install redis

Selepas pemasangan selesai, perkenalkan sambungan Redis dalam kod PHP:

<?php
    // 引入Redis扩展
    extension_loaded('redis') || dl('redis.so');
?>

Di sini. ialah contoh mudah yang menunjukkan cara melanggan dan Memproses mesej Redis:

<?php
    // 连接Redis服务器
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    // 订阅频道
    $redis->subscribe(['channel'], function ($redis, $channel, $message) {
        // 处理消息
        echo "收到来自频道 {$channel} 的消息:{$message}
";

        // 当收到"quit"消息时结束订阅
        if ($message == 'quit') {
            $redis->unsubscribe();
        }
    });

    // 关闭连接
    $redis->close();
?>

Dalam contoh di atas, kami mula-mula menyambung ke pelayan Redis melalui kaedah connect. Seterusnya, langgan satu atau lebih saluran melalui kaedah langgan. Dalam fungsi panggil balik, kita boleh mengendalikan mesej yang diterima. Apabila mesej tertentu (seperti "berhenti") diterima, hubungi kaedah nyahlanggan untuk menamatkan langganan. Akhir sekali, gunakan kaedah close untuk menutup sambungan ke pelayan Redis. connect方法连接Redis服务器。接下来,通过subscribe方法订阅一个或多个频道。在回调函数中,我们可以处理收到的消息。当收到特定消息(如"quit")时,调用unsubscribe方法结束订阅。最后,使用close方法关闭与Redis服务器的连接。

如果我们需要订阅多个频道,可以在subscribe方法中传入一个频道数组:

$redis->subscribe(['channel1', 'channel2'], function ($redis, $channel, $message) {
    // 处理消息
});

需要注意的是,Redis采用的是发布/订阅模式,而非队列模式。当我们发布一条消息时,所有订阅了该频道的客户端都将收到这条消息。而对于未订阅的客户端,将无法接收到之前发布的消息。

除了使用回调函数处理消息,我们还可以通过创建一个子进程来实现并行处理。以下是一个示例:

<?php
    // 创建子进程
    $pid = pcntl_fork();

    if ($pid == -1) {
        // 创建失败
        die('Fork failed');
    } elseif ($pid == 0) {
        // 子进程
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);

        $redis->subscribe(['channel'], function ($redis, $channel, $message) {
            // 处理消息
            echo "子进程收到来自频道 {$channel} 的消息:{$message}
";

            // 当收到"quit"消息时结束订阅
            if ($message == 'quit') {
                $redis->unsubscribe();
            }
        });

        $redis->close();
    } else {
        // 父进程
        pcntl_waitpid($pid, $status);
    }
?>

在上述示例中,我们通过pcntl_fork函数创建了一个子进程。子进程中的代码与前面的示例相同。父进程通过pcntl_waitpid

Jika kita perlu melanggan berbilang saluran, kita boleh menghantar dalam tatasusunan saluran dalam kaedah langgan:

rrreee

Perlu diambil perhatian bahawa Redis menggunakan mod terbitkan/langgan, bukan mod gilir . Apabila kami menerbitkan mesej, semua pelanggan yang melanggan saluran tersebut akan menerima mesej tersebut. Pelanggan yang tidak melanggan tidak akan dapat menerima mesej yang diterbitkan sebelum ini. 🎜🎜Selain menggunakan fungsi panggil balik untuk memproses mesej, kami juga boleh mencapai pemprosesan selari dengan mencipta sub-proses. Berikut ialah contoh: 🎜rrreee🎜Dalam contoh di atas, kami mencipta proses anak melalui fungsi pcntl_fork. Kod dalam proses anak adalah sama seperti contoh sebelumnya. Proses induk menunggu proses anak berakhir melalui pcntl_waitpid. 🎜🎜Melalui contoh kod di atas, kami boleh melaksanakan pemantauan berterusan PHP dan pemprosesan mesej Redis. Mekanisme ini sangat sesuai untuk senario seperti baris gilir mesej dan pemprosesan data masa nyata. Pada masa yang sama, kita juga boleh mengembangkan dan mengoptimumkan mengikut keperluan sebenar. Saya harap artikel ini akan membantu anda memahami dan menggunakan PHP untuk melaksanakan langganan dan pemprosesan mesej Redis. 🎜

Atas ialah kandungan terperinci Bagaimanakah PHP terus mendengar langganan mesej Redis dan memprosesnya?. 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