导航:首页 > 编程语言 > rabbitmqphp安装

rabbitmqphp安装

发布时间:2025-03-02 16:54:20

❶ 在php队列php-resque里头使用了数据库的单例模式显示MySQL server has gone away

PHP的轻量消息队列php-resque使用说明
消息队列处理后台任务带来的问题
项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。
为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很着名的产品。
消息队列说白了就是一个最简单的先进先出队列,队列的一个成员就是一段文本。正是因为消息队列实在太简单了,当拿着消息队列时,反而有点无从下手的感觉,因为这仅仅一个发送邮件的任务,就会引申出很多问题:
消息队列只能存储字符串类型的数据,如何将一个发送邮件这样的“任务”,转换为消息队列中的一个“消息”?
消息队列只负责数据的存放与进出,本身不能执行任何程序,那么我们要如何从消息队列中一个一个取出数据,再将这些数据转化回任务并执行。
我们无法预知消息队列何时会有数据产生,所以我们的任务执行程序还需要具备监控消息队列的能力,也就是一个常驻后台的守护进程。
一般的Web应用PHP都以cgi方式运行,无法常驻内存。我们知道php还有cli模式,那么守护进程是否能以php cli来实现,效率如何?
当守护进程运行时,Web应用能否与后台守护进程交互,实现开启/杀死进程的功能以及获得进程的运行状态?
Resque对后台任务的设计与角色划分
对以上这些问题,目前为止我能找到的最好答案,并不是来自php,而是来自Ruby的项目Resque,正是由于Resque清晰简单的解决了后台任务带来的一系列问题,Resque的设计也被Clone到Python、php、NodeJs等语言:比如Python下的pyres以及PHP下的php-resque等等,这里有各种语言版本的Resque实现,而在本篇日志里,我们当然要以PHP版本为例来说明如何用php-resque运行一个后台任务,可能一些细节方面会与Ruby版有出入,但是本文中以php版为准。
Resque是这样解决这些问题的:
后台任务的角色划分
其实从上面的问题已经可以看出,只靠一个消息队列是无法解决所有问题的,需要新的角色介入。在Resque中,一个后台任务被抽象为由三种角色共同完成:
Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
那么基于这个划分,一个后台任务在Resque下的基本流程是这样的:
将一个后台任务编写为一个独立的Class,这个Class就是一个Job。
在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列。
命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列。
Worker作为守护进程运行,并且定时检查队列。
当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法。
至此就可以完整的运行完一个后台任务。
在Resque中,还有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度。
php-resque的安装
需要提前说明的是,由于涉及到进程的开辟与管理,php-resque使用了php的PCNTL函数,所以只能在Linux下运行,并且需要php编译PCNTL函数。如果希望用Windows做同样的工作,那么可以去找找Resque的其他语言版本,php在Windows下非常不适合做后台任务。
以Ubuntu12.04LTS为例,Ubuntu用apt安装的php已经默认编译了PCNTL函数,无需任何配置,以下指令均为root帐号安装Redis
apt-get install redis-server
安装Composer
apt-get install curl
cd /usr/local/bin
curl -s http://getcomposer.org/installer | phpchmod a+x composer.phar
alias composer='/usr/local/bin/composer.phar'
使用Composer安装php-resque
假设web目录在/opt/htdocs
apt-get install git git-core
cd /opt/htdocs
git clone git://github.com/chrisboulton/php-resque.gitcd php-resque
composer install
php-resque的使用
编写一个Worker
其实php-resque已经给出了简单的例子, demo/job.php文件就是一个最简单的Job:
class PHP_Job
{
public function perform()
{
sleep(120);
fwrite(STDOUT, 'Hello!');
}
}
这个Job就是在120秒后向STDOUT输出字符Hello!
在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。
将Job插入队列
php-resque也给出了最简单的插入队列实现 demo/queue.php:
if(empty($argv[1])) {
die('Specify the name of a job to add. e.g, php queue.php PHP_Job');}
require __DIR__ . '/init.php';
date_default_timezone_set('GMT');
Resque::setBackend('127.0.0.1:6379');
$args = array(
'time' => time(),
'array' => array(
'test' => 'test',
),
);
$jobId = Resque::enqueue('default', $argv[1], $args, true);echo "Queued job ".$jobId."\n\n";
在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id。在终端输入:
php demo/queue.php PHP_Job
结果可以看到屏幕上输出:
Queued job 即Job已经添加成功。注意这里的Job名称与我们编写的Job Class名称保持一致:PHP_Job查看Job运行情况
php-resque同样提供了查看Job运行状态的例子,直接运行:
php demo/check_status.php 可以看到输出为:
Tracking status of . Press [break] to stop.
Status of is: 1我们刚才创建的Job状态为1。在Resque中,一个Job有以下4种状态:
Resque_Job_Status::STATUS_WAITING = 1; (等待)Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)Resque_Job_Status::STATUS_FAILED = 3; (失败)Resque_Job_Status::STATUS_COMPLETE = 4; (结束)因为没有Worker运行,所以刚才创建的Job还是等待状态。
运行Worker
这次我们直接编写demo/resque.php:
<?php
date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';
可以看到一个Worker至少需要两部分:
可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载包含Resque的默认Worker: bin/resque
在终端中运行:
QUEUE=default php demo/resque.php
前面的QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列。也可以使用QUEUE=* php demo/resque.php
来处理所有队列。
运行后输出为
#!/usr/bin/env php
*** Starting worker
用ps指令检查一下:
ps aux | grep resque
可以看到有一个php的守护进程已经在运行了
1000 4607 0.0 0.1 74816 11612 pts/3 S+ 14:52 0:00 php demo/resque.php再使用之前的检查Job指令
php demo/check_status.php 2分钟后可以看到
Status of is: 4任务已经运行完毕,同时屏幕上应该可以看到输出的Hello!
至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明。

❷ 学习thinkphp6.0使用rabbitmq示例


以下是如何在ThinkPHP 6.0中使用RabbitMQ进行示例,并通过supervisor实现消费者守护的简要步骤:


1. 安装与配置



2. 消息处理



3. 交换机与路由


RabbitMQ的关键概念包括:Broker(消息队列服务)、Exchange(消息路由)、Queue(消息队列)、Binding(绑定关系)和Routingkey(路由键)。消息流程包括生产者通过Exchange将消息路由到Queue,Queue再将消息分发给消费端。


交换机类型

❸ PHP实现消息队列MQ

MQ的应用场景主要解决异步消息、应用解耦、流量消峰等问题,同时也常用于日志处理。然而,MQ的引入导致系统可用性降低,因为系统需要考虑消息队列的可靠性,避免系统因消息队列故障而宕机。此外,MQ的引入增加了系统复杂性,需要处理一致性问题、防止消息重复消费和确保消息可靠传输。



对于消息重复消费的问题,解决方法如下:




消息模型分为P2P模式(点对点模式)和Pub/Sub(发布订阅模式)。P2P模式下,一个消息只能被一个消费者处理,包含消息队列、发送者和接受者三个角色。Work模式又分为轮循队列(一对多)和能者多劳(一对多)两种,每个消息只有一个消费者。发送者和接受者之间没有时间依赖性,接受者确认消息的接受和处理。



Pub/Sub模式下,包含主题、发布者和订阅者三个角色,一个生产者可以向多个消费者发送消息,消息经过交换机到达队列。Exchange(转发器)负责接受生产者的消息并将其推送到队列,实现一个消息被多个消费者消费。此外,还有Direct(路由模式)、Fanout(订阅模式)等模式。



在PHP中实现消息队列,首先需要安装RabbitMQ扩展,并在项目中添加Composer.json文件以整合RabbitMQ。实现包括简单模式(一对一)、Work模式(轮循队列)、Work模式(能者多劳)、每个消息只有一个消费者、发送者和接受者没有时间依赖、接受者确认消息接受和处理成功。



Pub/Sub模式在RabbitMQ中实现松耦合设计,通过主题、发布者和订阅者进行消息的发布与订阅。消息的持久化处理包括消息的可靠性机制、自动删除队列和交换机的设置以及消息确认机制。RabbitMQ的消息确认机制可以采用事务机制或Confirm机制,确保消息的可靠传输。



以上内容旨在帮助PHP开发者理解和实现消息队列的功能。更多进阶资料,包括分布式架构、高可扩展性、高性能、高并发、服务器性能调优、TP6、Laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、Shell脚本、Docker、微服务、Nginx等知识点的高级进阶干货,可关注公众号“PHP开源社区”或访问相关链接获取更多资源。

❹ 延时 (迟) 操作的 PHP 简单实现

在业务中,遇到延迟操作需求,比如下单半小时未支付取消订单,或下单十五分钟后未支付发短信提醒等场景。本文将介绍几种实现方式。

实现方式分为几种,首先,执行处理脚本在下单后定时运行,这种方式简洁但不优雅,且在处理大量订单时可能遇到性能瓶颈。

第二种方式是利用消费逻辑,在消费者中处理延迟操作,通过启动生产消息与消费者等待,这种方式利用现有服务,减少开发时间。

第三种方式引入消息队列如RabbitMQ。消费者启动,通过生产者启动消息,消息先入队列,过期后进入死信队列被消费,流转过程清晰可见。

第四种方式,参考原文“延时(迟)操作的PHP简单实现”,提供进阶PHP学习资源,包括分布式架构、高并发、高性能等知识点,助力PHP开发者提升技能。

希望以上内容能帮助大家解决业务中遇到的延迟操作问题,推动PHP开发者在进阶道路上成长。

阅读全文

与rabbitmqphp安装相关的资料

热点内容
app不见了怎么恢复华为 浏览:891
和家欢商城APP怎么样 浏览:49
嗷呜app怎么老师没有网络 浏览:51
域名如何划分阿里云服务器 浏览:971
程序员应会开发技术 浏览:853
pdf带链接 浏览:699
中兴手机加密失败怎么办 浏览:606
六大算法之三动态规划csdn 浏览:121
linux如何使用静态库 浏览:495
ubuntu安装驱动命令行 浏览:763
pdf修改字体大小 浏览:861
scrm源码下载 浏览:29
印尼孕妇溯源码燕窝的价钱 浏览:905
mel和python 浏览:758
vb背单词软件源码 浏览:801
epld和单片机 浏览:506
主力资金源码分析 浏览:574
怎么去掉pdf水印 浏览:767
北京边缘融合服务器云服务器 浏览:958
视频格式和压缩格式 浏览:381