linux - Des problèmes avec la simulation du minuteur crontab et l'implémentation de la file d'attente de messages avec PHP et MySQL? ?
巴扎黑
巴扎黑 2017-05-19 10:07:28
0
4
701

Par exemple, si vous devez créer une fonction pour envoyer des messages texte sur téléphone portable par lots, si vous utilisez une boucle for pour le faire, lorsque le nombre de messages texte est important, cela prendra non seulement du temps, mais aussi ont un taux de réussite très faible.

J'ai donc pensé à utiliser PHP et MySQL pour implémenter une file d'attente de messages et envoyer des messages texte un par un.

Tout d'abord, créez un tableau de données sms, comprenant les champs suivants :
id,
phone, //Numéro de téléphone portable
contenu //Contenu SMS
Enregistrez les messages texte et les numéros de téléphone portable qui doivent être envoyés dans le tableau sms.

Le code implémenté est le suivant :
<?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 'Envoyé terminé ! ';
?>

Par exemple, il y a un bouton d'envoi en arrière-plan. Cliquer dessus déclenche l'exécution du programme ci-dessus. Supposons que toutes les 10 secondes, une donnée est récupérée de la base de données pour envoyer un message texte.

Problème : si je clique sur le bouton d'envoi puis que je clique directement sur d'autres pages pour faire autre chose, au lieu de continuer à cliquer sur la page et d'attendre que l'envoi soit terminé avant de quitter, le programme ci-dessus continuera à s'exécuter. Ou si je vais sur d'autres pages, la boucle sautera et le SMS ne sera pas envoyé

巴扎黑
巴扎黑

répondre à tous(4)
淡淡烟草味

PHP est monothread, c'est-à-dire que lorsque vous démarrez l'exécution, vous devez soit attendre qu'elle soit entièrement exécutée, soit l'interrompre à l'avance. Vous ne pouvez pas effectuer deux accès en même temps. Si vous devez traiter de manière asynchrone après avoir cliqué sur un bouton et passer directement à autre chose, vous avez besoin du service swoole pour gérer les éléments que vous souhaitez traiter de manière asynchrone.

给我你的怀抱

Dans ce cas, exécutez-le simplement directement en mode ligne de commande sans le mettre sur la page web en arrière-plan. Ensuite, le code supérieur qui sort lorsqu'il n'y a pas de données est mis en veille pendant un certain temps.

世界只因有你

Vous pouvez jeter un œil au mode PHP-Cli. Il y a une vidéo sur MOOC.com, MySQL simule l'envoi d'e-mails via une file d'attente et l'effet est similaire à la question principale.

给我你的怀抱

Je pense que le php+mysql de l'affiche originale est correct, mais la tâche cron doit toujours être utilisée. La tâche cron consiste à définir le script à exécuter toutes les XX secondes.

Si vous devez abandonner crontab. Alors recommandez le code suivant

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); //每隔十秒循环一次  
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal