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é
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