如何使用PHP脚本删除MySQL中达到指定deliverydate日期的数据条目
需求实现方案
这个功能需要两部分配合完成:PHP删除逻辑脚本 + 系统定时任务触发执行,PHP本身没有常驻定时触发的能力,依赖系统定时任务实现每日自动执行。
1. 编写PHP过期数据删除脚本
你表中deliverydate存储格式为日.月.年,需要先转成MySQL可识别的日期格式再和当前日期比对,推荐用PDO做数据库连接,代码示例如下:
<?php // 数据库配置项,替换为你实际的配置 $db_config = [ 'host' => '127.0.0.1', 'dbname' => '你的数据库名', 'username' => '数据库账号', 'password' => '数据库密码', 'table' => '你的业务表名' ]; try { // 初始化PDO连接 $pdo = new PDO( "mysql:host={$db_config['host']};dbname={$db_config['dbname']};charset=utf8mb4", $db_config['username'], $db_config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 核心删除语句:转deliverydate格式为标准日期,匹配当天及之前到期的条目 $delete_sql = "DELETE FROM `{$db_config['table']}` WHERE STR_TO_DATE(`deliverydate`, '%d.%m.%Y') <= CURDATE()"; $stmt = $pdo->prepare($delete_sql); $stmt->execute(); // 可选:记录删除结果到日志 $log_content = date('[Y-m-d H:i:s]') . " 本次共删除" . $stmt->rowCount() . "条过期数据\n"; file_put_contents(__DIR__ . '/delete_expired_log.txt', $log_content, FILE_APPEND); } catch (Exception $e) { // 错误日志记录 $error_log = date('[Y-m-d H:i:s]') . " 执行错误:" . $e->getMessage() . "\n"; file_put_contents(__DIR__ . '/delete_expired_error.txt', $error_log, FILE_APPEND); exit(1); } ?>
2. 配置定时任务触发脚本
Linux服务器(用Crontab)
执行crontab -e进入编辑界面,添加如下一行配置,就能实现每天0点自动执行脚本:
0 0 * * * /usr/bin/php /www/path/delete_expired.php >/dev/null 2>&1
- 把
/usr/bin/php替换为你服务器上PHP的实际执行路径(可以用which php命令查看) - 把
/www/path/delete_expired.php替换为你脚本存放的实际绝对路径 - 如果需要保留执行日志,可以把
>/dev/null改成你日志文件的路径,比如>> /www/path/delete_log.log
Windows服务器(用任务计划程序)
- 打开「任务计划程序」,选择「创建基本任务」
- 触发器设置为「每天」,时间选0点
- 操作选择「启动程序」,程序或脚本填php.exe的本地路径,参数填你脚本的完整绝对路径
优化建议
- 如果你的表数据量较大,建议把
deliverydate字段改成DATE类型存储,写入数据时就转成YYYY-MM-DD的标准格式,这样删除语句可以直接写WHERE deliverydate <= CURDATE(),能用上字段索引,执行效率会高很多 - 可以在删除前增加备份逻辑,把即将删除的条目写入历史归档表,避免误删后无法恢复数据
内容的提问来源于stack exchange,提问作者Mikka Kummer
相关产品推荐
相关产品推荐

