首頁  >  問答  >  主體

linux - 模擬crontab定時器,用PHP和MySQL實作訊息佇列的問題? ?

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

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

巴扎黑巴扎黑2680 天前654

全部回覆(4)我來回復

  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:09:28

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

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:09:28

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

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:09:28

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

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱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); //每隔十秒循环一次  

    回覆
    0
  • 取消回覆