linux - 模擬crontab定時器,用PHP和MySQL實作訊息佇列的問題? ?
巴扎黑
巴扎黑 2017-05-19 10:07:28
0
4
692

比如說需要做一個批量發送手機短信的功能,如果是用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秒從資料庫取一封資料發送簡訊。

問題:如果我點擊發送按鈕後就直接點擊其他頁面做其他的去了,而不是一直在點擊頁面等待直到發送完畢才離開的話,上面的程式還會執行下去了。還是說我去到其他頁面內了,就會跳出循壞不會執行發送短信了

巴扎黑
巴扎黑

全部回覆(4)
淡淡烟草味

PHP是單線程,也就是你一開始執行,要嘛等它全部執行完畢,要嘛提前中斷,不能同時進行兩個訪問。如果說需要點擊按鈕之後非同步處理,直接跳過去幹別的事情,那就需要swoole這個服務來處理你要非同步處理的事情。

给我你的怀抱

這種情況,直接在命令列模式運行就好了,不用放在後台網頁上。然後最上面沒有資料就退出的程式碼,改為sleep一段時間。

世界只因有你

PHP-Cli模式你可以看一下。慕課網有視頻,mysql模擬隊列發送郵件,和題主要的效果類似。

给我你的怀抱

我覺的樓主的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); //每隔十秒循环一次  
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板