在PHP中实现定时发送短信的业务逻辑时,需要考虑以下几个关键步骤和注意事项:
业务逻辑
- 设置定时任务:
- 使用Linux的cron job或其他定时任务工具(如Windows的任务计划程序)来定期执行PHP脚本。
- 确定定时任务的执行频率,例如每分钟、每小时、每天等。
- 编写PHP脚本:
- 在PHP脚本中,首先连接到数据库(如果需要从数据库中获取要发送短信的数据)。
- 查询数据库,获取需要发送短信的用户列表和相应的短信内容。
- 使用短信服务提供商的API或其他发送方式(如SMTP)来发送提醒。
- 处理发送结果:
- 在发送短信后,捕获并处理任何可能的错误或异常。
- 更新数据库中的记录,标记短信为已发送或记录发送结果。
- 日志记录:
- 记录所有发送活动的日志,包括发送时间、发送内容、接收者、发送结果等。
- 这有助于监控和排查问题。
注意事项
- 性能优化:
- 对于大量发送短信的场景,优化数据库查询和API调用,减少不必要的资源消耗和延迟。
- 考虑使用缓存或其他技术来提高性能。
- 错误处理和重试机制:
- 在发送短信时添加错误处理逻辑,以便在发生错误时能够重新尝试发送或记录错误信息。
- 可以设置重试次数和重试间隔,以确保短信能够成功发送。
- 监控和报警:
- 设置监控机制,定期检查短信发送的成功率和异常情况。
- 在发生严重错误或发送失败时,及时发送报警通知,以便及时处理问题。
一、判断故障时间大于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定时发送短信的业务逻辑需要综合考虑多个方面,包括定时任务的设置、性能优化、错误处理和重试机制等。通过合理的设计和实现,可以确保短信发送的准确性和稳定性,提升用户体验和业务效果。
@漏刻有时
















