繁体   English   中英

MySQL - 根据发送/失败的文本更新多行的最佳方法

[英]MySQL - best way to update multiple rows based on text sent/fail

我有一个每天运行的 PHP 脚本,循环遍历所有用户向他们发送文本,并更新他们的状态。 基本上是这样的……(伪代码)

$sql="SELECT UserPhone from users WHERE Status='LOW'";
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) {
   // loop through and send texts
}
// then update status
$sql="UPDATE users SET Status='MED'";

我可以检测文本是否发送成功,如果文本成功,我只想更新用户的状态。 我的第一个直觉是将 UPDATE 移到 while 循环中并单独更新每个用户的行,就像这样,再次伪代码:

while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) {
    $sent=sendText($phone);
    if($sent) {
        $sql=UPDATE users SET Status='MED' WHERE UserPhone=$phone";
    }
}

这对我来说感觉很笨重,我猜这对性能不利。 感觉就像我应该能够存储/记住发送的文本并使用单个 UPDATE 更新所有这些用户(或者至少不需要为每一行更新的东西)。

我知道足够的 MySQL 来做一些愚蠢的事情。 有一个更好的方法吗?

你可以这样做:

$sql="SELECT UserPhone from users WHERE Status='LOW'";
$successes = []
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) {
   // loop through and send texts, set $ok to the success/fail
   if ($ok) {
      $successes[] = $row['UserPhone']
   }
}
// then update status
$placeholders = implode(",", array_fill(0, count($successes), "?");
$sql="UPDATE users SET Status='MED' WHERE UserPhone IN ($placeholders)";
$stmt = mysqli_prepare($sql);
$stmt->bind_param(str_repeat("s", count($successes)), ...$successes);
$stmt->execute();

但这是一个风险。 如果 PHP 脚本在中途中断怎么办? 例如,在 while 循环期间,可能其中一个文本发送导致致命错误,脚本退出,丢失了迄今为止积累的关于哪些文本成功的信息。

我在 SchoolMessenger.com 工作了几年。 我们每天发送多达 900 万条短信(自从我离开那份工作后,现在可能更高)。

这是我们如何完成任务的伪代码(我们的服务是用 Java 编写的,而不是 PHP):

for each user who should be sent a text {
  INSERT INTO Tasks SET UserPhone = ?, Message = ?, Status = 'TODO'
}

然后,我们为每个用户发送每个文本一行。 有另一个程序监视这个任务表,寻找任何状态为“TODO”的任务。 当这发现某些行存在时:

for each row in Tasks that is 'TODO' {
  Send the text message
  Check success
  Update the status on that one row to 'Success' or 'Fail'
}

这看起来很笨拙,但是很多像这样的系统旨在记住它们在崩溃时停止的位置。 将结果一步一步保存到数据库中会有所帮助,因为一旦程序启动,它可以看到哪些文本已经发送,并且避免重新发送任何文本(因为学童的父母不希望收到相同的消息反复)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM