最近遇到一个批量发送短信的需求,短信接口是第三方提供的。刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗?
但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低。
于是想到,用PHP和MySQL实现一个消息队列,一条一条的发送短信。下面介绍具体的实现方法:
首先,建立一个数据表sms,包含以下字段:
1
2
3
id,
phone, //手机号
content //短信内容
将需要发送的短信和手机号存入sms表中。
接下来,需要用PHP实现一个定时器,定时读取一条记录,并发送短信:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$db
=
new
Db();
$sms
=
new
Sms();
while
(true){
$item
=
$db
->getFirstRecord();
//获取数据表第一条记录
if
(!
$item
){
//如果队列中没有数据,则结束定时器
break
;
}
$res
=
$sms
->send(
$item
[
'phone'
],
$item
[
'content'
]);
//发送短信
if
(
$res
){
$db
->deleteFristRecord();
//删除发送成功的记录
echo
$item
[
'phone'
].
'发送成功'
;
}
else
{
echo
$item
[
'phone'
].
'发送失败,稍后继续尝试'
;
}
sleep(10);
//每隔十秒循环一次
}
echo
'发送完毕!'
;
?>
将代码保存为timer_sms.php,打开命令行,执行定时器:
1
php timer_sms.php
好了,php定时器将会根据设定的时间间隔(这里设的是10秒),自动完成发送短信的任务。任务完成后将自动退出定时器,不再占用服务器资源。
根据我的测试,PHP定时器占用资源并不多,不会对服务器造成压力。而且是异步访问数据库,也不会影响数据库的运行。
这种方式的优点是:
1、后台运行,前台无需等待
2、成功率高,失败的记录会自动重发,直到成功