Heim  >  Fragen und Antworten  >  Hauptteil

linux – Probleme bei der Simulation des Crontab-Timers und der Implementierung der Nachrichtenwarteschlange mit PHP und MySQL? ?

Zum Beispiel müssen Sie eine Funktion zum stapelweisen Senden von Textnachrichten auf Mobiltelefonen erstellen. Wenn Sie dazu eine for-Schleife verwenden, ist dies bei einer großen Anzahl von Textnachrichten nicht nur zeitaufwändig, sondern auch zeitaufwändig eine sehr niedrige Erfolgsquote.

Also dachte ich darüber nach, PHP und MySQL zu verwenden, um eine Nachrichtenwarteschlange zu implementieren und Textnachrichten einzeln zu senden.

Erstellen Sie zunächst eine Datentabellen-SMS, einschließlich der folgenden Felder:
ID,
Telefon, //Mobiltelefonnummer
Inhalt //SMS-Inhalt
Speichern Sie die Textnachrichten und Mobiltelefonnummern, die gesendet werden müssen, in der SMS-Tabelle.

Der implementierte Code lautet wie folgt:
<?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 'Gesendet abgeschlossen! ';
?>

Zum Beispiel gibt es im Hintergrund eine Schaltfläche zum Senden, die die Ausführung des oben genannten Programms auslöst. Angenommen, alle 10 Sekunden werden Daten aus der Datenbank abgerufen, um eine Textnachricht zu senden.

Problem: Wenn ich auf die Schaltfläche „Senden“ klicke und dann direkt auf andere Seiten klicke, um andere Dinge zu tun, wird das obige Programm weiterhin ausgeführt, anstatt weiter auf die Seite zu klicken und zu warten, bis der Versand abgeschlossen ist, bevor ich sie verlasse. Oder wenn ich auf andere Seiten gehe, springt die Schleife heraus und die SMS wird nicht gesendet

巴扎黑巴扎黑2731 Tage vor681

Antworte allen(4)Ich werde antworten

  • 淡淡烟草味

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

    PHP是单线程,也就是你一开始执行,要么等它全部执行完毕,要么提前中断,不能同时进行两个访问。如果说需要点击按钮之后异步处理,直接跳过去干别的事情,那就需要swoole这个服务来处理你要异步处理的事情。

    Antwort
    0
  • 给我你的怀抱

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

    这种情况,直接在命令行模式运行就好了,不用放在后台网页上。然后最上面没有数据就退出的代码,改为sleep一段时间。

    Antwort
    0
  • 世界只因有你

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

    PHP-Cli模式你可以看一下。慕课网有视频,mysql模拟队列发送邮件,和题主要的效果类似。

    Antwort
    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); //每隔十秒循环一次  

    Antwort
    0
  • StornierenAntwort