在PHP中实现定时发送短信的业务逻辑时,需要考虑以下几个关键步骤和注意事项:

业务逻辑

  1. 设置定时任务
  • 使用Linux的cron job或其他定时任务工具(如Windows的任务计划程序)来定期执行PHP脚本。
  • 确定定时任务的执行频率,例如每分钟、每小时、每天等。
  1. 编写PHP脚本
  • 在PHP脚本中,首先连接到数据库(如果需要从数据库中获取要发送短信的数据)。
  • 查询数据库,获取需要发送短信的用户列表和相应的短信内容。
  • 使用短信服务提供商的API或其他发送方式(如SMTP)来发送提醒。
  1. 处理发送结果
  • 在发送短信后,捕获并处理任何可能的错误或异常。
  • 更新数据库中的记录,标记短信为已发送或记录发送结果。
  1. 日志记录
  • 记录所有发送活动的日志,包括发送时间、发送内容、接收者、发送结果等。
  • 这有助于监控和排查问题。

注意事项

  1. 性能优化
  • 对于大量发送短信的场景,优化数据库查询和API调用,减少不必要的资源消耗和延迟。
  • 考虑使用缓存或其他技术来提高性能。
  1. 错误处理和重试机制
  • 在发送短信时添加错误处理逻辑,以便在发生错误时能够重新尝试发送或记录错误信息。
  • 可以设置重试次数和重试间隔,以确保短信能够成功发送。
  1. 监控和报警
  • 设置监控机制,定期检查短信发送的成功率和异常情况。
  • 在发生严重错误或发送失败时,及时发送报警通知,以便及时处理问题。

一、判断故障时间大于2小时的事件发送企业微信提醒

//1.获取大于2小时的异常记录;
$sql = "SELECT security_id,school_id,school_short_name,security_total,security_offline,security_rate,security_send,FROM_UNIXTIME(service_offtime) AS service_offtime,TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(service_offtime), NOW()) AS hours_diff,TIMESTAMPDIFF(DAY, FROM_UNIXTIME(service_offtime), NOW()) AS day_diff FROM " . $db->table('security') . " WHERE 1";
$sql .= " AND TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(service_offtime), NOW()) >= " . intval($CONF_SYS['hours_diff']);//存在离线数据
$sql .= " AND security_state = 1";//异常
$sql .= " AND security_send = 0 ";//未发送且保证发送一次
$sql .= " ORDER BY security_id DESC";
$row = $db->queryall($sql);
  • TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(service_offtime), NOW()) AS hours_diff,获取离线的时间小时数的差
  • TIMESTAMPDIFF(DAY, FROM_UNIXTIME(service_offtime), NOW()) AS day_diff获取离线的时间天数的差
//遍历发送消息
if ($row) {
    foreach ($row as $v) {
        //发送信息;
        $diff = calcDifference($v['service_offtime'], date('Y-m-d H:i:s'));
        $dataArr = [$v['school_short_name'], $v['security_total'], $v['security_offline'], $v['security_rate'] . "%", '未达标', $v['service_offtime'], $diff, $hook_title, $hook_phone];
        foreach ($keys as $key) {
            wxRobot($key, $dataArr, 1);
        }
        //更新状态
        $db->update('security', array('security_send' => 1), array('security_id' => $v['security_id']));
    }
}

二、判断故障时间每隔10天进行发送企业微信提醒

//2.获取大于10-100天的异常记录;
$sql_more = "SELECT security_id,school_id,school_short_name,security_total,security_offline,security_rate,security_send,FROM_UNIXTIME(service_offtime) AS service_offtime,TIMESTAMPDIFF(DAY, FROM_UNIXTIME(service_offtime), NOW()) AS day_diff FROM " . $db->table('security') . " WHERE 1";
$sql_more .= " AND security_state = 1";//异常
$sql_more .= " AND security_send >= 1";//已发送过信息
$sql_more .= " ORDER BY security_id DESC";
$row_more = $db->queryall($sql_more);
//发送信息
$diffArr = generateMultiplesArray($days_diff, 10);//发送信息的时间间隔天数

if ($row_more) {
    foreach ($row_more as $p) {
        if (in_array($p['day_diff'], $diffArr) && ($p['day_diff'] / 10) == $p['security_send']) {
            //发送信息;
            $diff = calcDifference($p['service_offtime'], date('Y-m-d H:i:s'));
            $dataArr = [$p['school_short_name'], $p['security_total'], $p['security_offline'], $p['security_rate'] . "%", '未达标', $p['service_offtime'], $diff, $hook_title, $hook_phone];
            foreach ($keys as $key) {
                wxRobot($key, $dataArr, 1);
            }
            //更新状态
            $db->update('security', array('security_send' => $p['security_send'] + 1), array('security_id' => $p['security_id']));
        }
    }
}

三、到期前8:30和提前一小时提醒的定时任务

$sql = "SELECT plan_id,FROM_UNIXTIME(plan_to) AS plan_to,
      DATE_FORMAT(  
        DATE_SUB(FROM_UNIXTIME(plan_to), INTERVAL 1 DAY),  
        '%Y-%m-%d 08:30:00'  
    )   AS plan_prev_day,
     DATE_SUB(  
        FROM_UNIXTIME(plan_to),  
        INTERVAL 1 HOUR  
    ) AS plan_prev_hour,
       user_name,user_phone,plan_status,plan_send FROM " . $db->table('plan') . " WHERE plan_status = 1";
$sql .= " ORDER BY plan_id DESC";
$row = $db->queryall($sql);
  • DATE_FORMAT(
    DATE_SUB(FROM_UNIXTIME(plan_to), INTERVAL 1 DAY),
    ‘%Y-%m-%d 08:30:00’
    ) AS plan_prev_day,获取前一天八点半的时间点
  • DATE_SUB(
    FROM_UNIXTIME(plan_to),
    INTERVAL 1 HOUR
    ) AS plan_prev_hour,获取提前2小时的时间点
//遍历提醒
foreach ($row as $k => $v) {
    //前一天的8:30提醒
    if ($v['plan_send'] == 0 && strtotime($v['plan_prev_day']) <= time()) {
        //发送短信
        wxRobot($key, $dataArr, 1);
        //更新状态;
        $db->update('plan', array('plan_send' => 1), array('plan_id' => $v['plan_id']));
    }

    //前一天的8:30提醒
    if ($v['plan_send'] == 1 && strtotime($v['plan_prev_hour']) <= time()) {
        //发送短信
        wxRobot($key, $dataArr, 1);
        //更新状态;
        $db->update('plan', array('plan_send' => 2), array('plan_id' => $v['plan_id']));
    }

    //超过时间为动作,改为未完成状态;
    if ($v['plan_send'] == 2 && strtotime($v['plan_to']) <= time()) {
        $db->update('plan', array('plan_status' => -1), array('plan_id' => $v['plan_id']));
    }
}

四、整点发送提醒

//获取当前小时数
$h_cuur = date('H', time());
$day_today = date('Y年m月d日', time());
$curr_today = date('Y-m-d H:i', time());
//10点发送数据
if($lock_cuur == 10){
	if($lock_end != ''){
		   wxRobot($key, $dataArr, 1);
	}
}
//11点发送数据
if($lock_cuur == 11){
	if($lock_end != ''){
		   wxRobot($key, $dataArr, 1);
	}
}
//12点
if($lock_cuur == 12){
	if($lock_end != ''){
		   wxRobot($key, $dataArr, 1);
	}

总之,实现PHP定时发送短信的业务逻辑需要综合考虑多个方面,包括定时任务的设置、性能优化、错误处理和重试机制等。通过合理的设计和实现,可以确保短信发送的准确性和稳定性,提升用户体验和业务效果。


@漏刻有时