以郵箱發送隊列爲例子說明,以下使用的是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);
}
}
} $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請求不同的消息隊列【此方法調用,需要使用服務器定時任務處理】