比如說需要做一個批量發送手機短信的功能,如果是用for循壞這樣的來做的話,當短信數量很大時,不僅耗時,而且成功率很低。
於是想到,用PHP和MySQL實作一個訊息佇列,一則的發送簡訊。
首先,建立一個資料表sms,包含以下欄位:
id,
phone, //手機號碼
content //簡訊內容
將需要傳送的簡訊和手機號碼存入sms表中。
實作的程式碼如下:
<?php
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 '寄完畢! ';
?>
比如說,後台有一個發送按鈕,點擊觸發上面的程式執行,假設每隔10秒從資料庫取一封資料發送簡訊。
問題:如果我點擊發送按鈕後就直接點擊其他頁面做其他的去了,而不是一直在點擊頁面等待直到發送完畢才離開的話,上面的程式還會執行下去了。還是說我去到其他頁面內了,就會跳出循壞不會執行發送短信了
淡淡烟草味2017-05-19 10:09:28
PHP是單線程,也就是你一開始執行,要嘛等它全部執行完畢,要嘛提前中斷,不能同時進行兩個訪問。如果說需要點擊按鈕之後非同步處理,直接跳過去幹別的事情,那就需要swoole這個服務來處理你要非同步處理的事情。
给我你的怀抱2017-05-19 10:09:28
我覺的樓主的php+mysql沒錯,但是cron job還是要用上的。 cron job就是設定間隔XX秒執行一下腳本。
如果非要放棄crontab。那麼推薦下面程式碼
ignore_user_abort() //关掉浏览器,php脚本可以继续执行
set_time_limit(0) // 一直执行下去
$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); //每隔十秒循环一次