git地址:https://github.com/Filix/sms_queue
简介
通过队列的方式发送短信,暂时实现了redis作为队列。
发送短信方,只需要将短信丢进队列。队列分主、副两个队列。
优先选择丢进住队列,在丢进住队列前,判断若主队列消息堆积,则丢进副队列。
两个队列对应两个消费者:主消费者和副消费者。
主消费者从主队列获取消息,尝试发送,若失败则丢进副队列,有副队列负责发送。
使用方式
创建消息、消息入队列
use Filix\SMS\Queue\RedisQueue; use Filix\SMS\Message\Message; use Filix\SMS\Producer\PrimaryProducer; use Filix\SMS\SmsService\BWService; $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //主队列 $primaryQueue = new RedisQueue($redis, 'PRIMARY_CHANNEL'); //副队列 $secondaryQueue = new RedisQueue($redis, 'SECONDARY_CHANNEL'); //创建sms $message = new Message(); $message->setMobiles(array('13512345678', '13412345678')); $message->setContent('Hello!'); //将百悟作为主服务 $service = new BWService($corp_id, $corp_pwd, $corp_service); //主生产者 $producer = new PrimaryProducer($service, $primaryQueue, $secondaryQueue); //其实只是丢进主队列或副队列(主队列堆积时),并没有真正的发送 $producer->send($message);
发送消息
创建主消费者脚本:
use Filix\SMS\Queue\RedisQueue; use Filix\SMS\Customer\PrimaryCustomer; use Filix\SMS\SmsService\BWService; $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $primaryQueue = new RedisQueue($redis, 'PRIMARY_CHANNEL'); $secondaryQueue = new RedisQueue($redis, 'SECONDARY_CHANNEL'); $service = new BWService($corp_id, $corp_pwd, $corp_service); $customer = new PrimaryCustomer($service, $primaryQueue, $secondaryQueue); while(1){ $result = $customer->fetchAndSend(3); //一次获取3条消息,并发地向服务商接口发送 sleep(1); }
自定义
自定义queue
实现Filix\Queue\QueueInterface接口即可,如实现自己的Mysql队列、RabbitMQ队列等。
自定义第三方短信服务商
实现Filix\SmsService\ServiceInterface接口即可。