PHP簡單實現消息隊列功能

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章