使用PHP和Redis实现消息队列功能

前言

今天,我们继续讲消息队列,如何使用Redis实现消息队列的功能。

前期准备,需要安装好docker、docker-compose的运行环境。

PHP的项目运行环境可以参考下面的文章内容。

如何使用docker部署php服务

前面我们也讲了PHP和RabbitMQ实现消息队列的功能,感兴趣的可以查看下面的文章。

如何使用PHP和RabbitMQ实现消息队列?

一、安装Redis

1、安装Redis的步骤可以参考下面的文章内容。

Redis不同的持久化方式有什么差异?我们来做个小试验。

二、安装PHP的Redis扩展

1、打开浏览器,找到扩展下载地址,PECL :: Package :: redis。

使用PHP和Redis实现消息队列功能

2、进入test1项目容器,执行如下命令。

docker exec -ti test1 sh

3、下载扩展,编译安装,执行如下命令。

wget https://pecl.php.net/get/redis-6.0.2.tgz
tar -xzvf redis-6.0.2.tgz
cd redis-6.0.2/
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

4、增加redis扩展修改php.ini配置,增加如下内容。

extension=redis.so

5、检查扩展是否配置成功,执行如下命令。

php -m|grep redis

返回如下内容,说明已安装完成。

使用PHP和Redis实现消息队列功能

6、至此,PHP的Redis扩展已安装完成。

三、测试验证

1、编写生产者,代码内容如下。

vim producer.php
<?php
// 创建Redis实例
$redis = new Redis();
 
try {
    // 连接到Redis服务器
    $redis->connect('redis', 6379);
    echo "成功连接到Redis服务器!\r\n";
 
    // 将消息入队(添加到列表的尾部)
    $datetime = date('Y/m/d H:i:s');
    $message = 'Hello Max!';
    $redis->rPush('message_queue', $message);
    echo "消息已入队,datetime={$datetime},message={$message}\r\n";
} catch (RedisException $e) {
    // 处理连接错误
    echo "无法连接到Redis服务器: " . $e->getMessage();
}
 
// 关闭Redis连接
$redis->close();

2、编写消费者,代码内容如下。

vim consumer.php
<?php
// 创建Redis实例
$redis = new Redis();
 
try {
    // 连接到Redis服务器
    $redis->connect('redis', 6379);
    echo "成功连接到Redis服务器!\r\n";
 
    while (true) {
        // 可以使用BLPOP命令来阻塞等待消息
        $message = $redis->blPop('message_queue', 0); // 0表示无限等待
        if ($message !== null) {
            $datetime = date('Y/m/d H:i:s');
            list($queue, $msg) = $message;
            echo "消息出列,datetime={$datetime},queue=${queue},message=${msg}\r\n";
        }
        usleep(100);
    }
} catch (RedisException $e) {
    // 处理连接错误
    echo "无法连接到Redis服务器: " . $e->getMessage();
}
 
// 关闭Redis连接
$redis->close();

3、启动消费端,执行如下命令。

php consumer.php

正常情况会返回如下内容,开始监听消息。

使用PHP和Redis实现消息队列功能

4、运行生产端,执行如下命令。

php producer.php

正常情况会返回如下内容。

使用PHP和Redis实现消息队列功能

5、再看消费端接收到的消息,正常返回如下内容。

使用PHP和Redis实现消息队列功能

上面的截图是执行了三次生产端,生成了三条消息。

6、至此,PHP和Redis实现消息队列的功能已验证完成。

总结

其实PHP和Redis实现消息队列的功能,使用的是Redis的List这种数据结构。

使用rPush入列、blPop出列,实现队列的先进先出(FIFO)。

也可以使用lPush入列、blPop出列,来实现队列的先进后出(FILO)。

实现PHP和Redis消息队列的功能,其实就以下三个步骤。

1、安装Redis。

2、安装PHP的Redis扩展。

3、编写生产者、消费者代码进行测试验证。

上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做进一步的优化。

到此这篇关于使用PHP和Redis实现消息队列功能的文章就介绍到这了,更多相关PHP Redis消息队列内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:QYKWD,如若转载,请注明出处:http://www.wangzhanshi.com/n/712.html

(0)
QYKWD的头像QYKWD
上一篇 2024年12月17日 17:53:16
下一篇 2024年12月17日 17:53:18

相关推荐

  • 使用PHP7的注意事项有哪些

    1、不要使用 mysql_ 函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数。PHP 7已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数…

    php 2025年1月1日
  • PHP实现添加图片水印的示例代码

    以下是 `_imgWatermark` 函数的中文注释和解析。该函数用于在图像上添加水印: function _imgWatermark($src_image, $water_im…

    php 2024年12月17日
  • php7垃圾回收机制的示例分析

    文章目录 zval 的结构 循环引用造成的内存泄漏 object和array的回收过程 垃圾回收的原理 例子 在了解我们 php GC 时,我觉得我有必要介绍一下们的 php 的变…

    2025年1月1日
  • THINKPHP跨域报错的解决方案

    报错:has been blocked by CORS policy: Response to preflight request doesn't pass access…

    2024年12月17日
  • yum安装php7版本的步骤

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从…

    2025年1月1日
  • PHP GC回收机制实例详解

    前言 GC的全称是Garbage Collection也就是垃圾回收的意思,在PHP中,是使用引用计数和回收周期来自动管理内存对象的,当一个对象被设置为NULL,或者没有任何指针指…

    2024年12月17日
  • Vue3中样式渗透:deep()无效怎么解决

    :deep()的使用场景: 如果给当前组件的style 节点添加了scoped 属性,则当前组件的样式对其子组件是不生效的。如果想让某些样式对子组件生效,则需要使用:deep()。…

    2025年1月2日
  • 导致php7比5快原因是什么

    性能提升的原因? 1、存储变量的结构体变小,尽量使结构体里成员共用内存空间,减少引用,这样内存占用降低,变量的操作速度得到提升。 2、字符串结构体的改变,字符串信息和数据本身原来是…

    php 2025年1月1日
  • apache中不解析php7如何解决

    解决Apache无法解析PHP问题 编辑httpd.conf文件 添加如下代码 LoadModule php7_module modules/libphp7.s…

    php 2025年1月1日
  • PHP8中的JIT是什么

    JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中…

    2025年1月2日

发表回复

登录后才能评论