PHP简单实现消息队列功能

原创
所属分类: 后端开发 2017-11-16 423
来源:baidu.com

以邮箱发送队列为例子说明,以下使用的是thinkphp3.2.3框架的代码,消息队列类似


1)  新增队列表

DROPTABLE IF EXISTS `ls_task_email`;
 
CREATETABLE IF NOT EXISTS `ls_task_email` (
 
  `task_email_id` int(11) NOT NULLAUTO_INCREMENT,
 
  `user_email` varchar(255) NOT NULL COMMENT '邮箱',
 
  `user_name` varchar(255) NOT NULL COMMENT '用户名',
 
  `subject` varchar(255) NOT NULL COMMENT '标题',
 
  `body` text NOT NULL COMMENT '内容',
 
  `attachment` text NOT NULL COMMENT '发送附件',
 
  `status` int(11) NOT NULL COMMENT '1:发送成功,-1:发送失败',
 
  `add_time` timestamp NOT NULL DEFAULTCURRENT_TIMESTAMP,
 
  `update_time` int(11) NOT NULL,
 
  PRIMARY KEY (`task_email_id`)
 
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='邮箱队列任务表' AUTO_INCREMENT=1 ;


2)  在对应需要发送消息的位置,插入队列数据,也就是新增表数据


3)  前台界面异步请求消息发送接口,在发送消息的位置,获取队列表中的任务队列,每次获取5-10条发送

$taskEmail = M('task_email');
while(true) {
	$task_email_list = $taskEmail->where('status=0')->order('task_email_id ASC')->limit(5)->select();
 
	if(empty($task_email_list)) {
		break;
	} else {
		foreach($task_email_list as $k => $v) {
			$send_result = send_mail($v['user_email'], $v['user_name'], $v['subject'], $v['body'], $v['attachment']);
 
            		$update_email_data = array(
            			'status'=>(true == $send_result ? 1 : -1),
            			'update_time'=>time(),
            			'error_info'=>(true == $send_result ? '' : $send_result),
            		);
           		 $taskEmail->where('task_email_id='.$v['task_email_id'])->save($update_email_data);
 
            		sleep(3);
        	}
	}
}


4)  使用while(1)循环发送消息,修改任务状态后,使用sleep(3)控制发送间隔时间,如果队列为空则跳出while循环


5)  如果需要同时发送多个消息队列的消息,需要在PHP中处理,不能在前台调用多个$.post请求不同的消息队列【此方法调用,需要使用服务器定时任务处理】

原创声明:本文为博主原创文章,转载请附上原文出处链接和声明。

相关推荐

更多内容>

PHP7+微信公众号主动通知事件mcrypt_module_open函数无法使用

后端开发

PHPExcel导出Excel基本操作,实现设置字体、合并单元格、加粗等功能

后端开发

PHP 数字转大写(中文)格式,规则可以自行调整

后端开发

php使用header方法下载文件

后端开发
点这里分享到
朋友圈