无法修改exe时,MySQL表新增记录触发PHP脚本的方案咨询
可行解决方案
方案一:MySQL二进制日志(Binlog)实时监听
这是最直接的实时触发方式,无需修改现有exe或数据库触发器,且能避开事务未提交的问题(Binlog仅记录已提交的事务)。
配置步骤
开启并配置MySQL Binlog
修改MySQL配置文件(my.ini/my.cnf),添加或修改以下参数:log_bin = D:/mysql/binlogs/mysql-bin.log # 替换为你的日志存储路径 binlog_format = ROW server_id = 1 # 唯一ID,不能与其他复制节点重复重启MySQL服务使配置生效。
创建专用监听用户
为监听程序创建最小权限的数据库用户,避免过度授权:CREATE USER 'binlog_monitor'@'localhost' IDENTIFIED BY 'strong_password'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'binlog_monitor'@'localhost'; FLUSH PRIVILEGES;编写PHP Binlog监听脚本
使用PHP的MySQL复制类库(如php-mysql-replication)解析Binlog,捕获目标表的INSERT事件:<?php require __DIR__ . '/vendor/autoload.php'; use MySQLReplication\Config\ConfigBuilder; use MySQLReplication\MySQLReplication; $config = (new ConfigBuilder()) ->withHost('127.0.0.1') ->withUser('binlog_monitor') ->withPassword('strong_password') ->withPort(3306) ->withSlaveId(100) ->build(); $replication = new MySQLReplication($config); $replication->subscribe(function ($event) { // 仅处理目标表的INSERT事件 if ($event instanceof \MySQLReplication\Event\DTO\InsertDTO) { if ($event->getDatabase() === 'your_database' && $event->getTable() === 'target_table') { $newRecord = $event->getRows()[0]; // 执行你的业务逻辑脚本 require_once __DIR__ . '/path/to/your/handler_script.php'; // 或通过命令行调用(需确保权限安全) // exec('php "' . __DIR__ . '/handler_script.php" ' . escapeshellarg(json_encode($newRecord))); } } }); // 持续运行监听 $replication->run();将监听脚本转为Windows服务
使用NSSM(Non-Sucking Service Manager)将PHP脚本注册为Windows服务,确保后台持续运行:nssm install BinlogMonitor "C:\PHP\php.exe" "C:\path\to\your\monitor_script.php"注册后可通过Windows服务管理器启动、停止或设置开机自启。
优缺点
- 优点:实时性强(事务提交后立即触发),不干扰原有业务流程,权限可控安全性高,升级到MySQL 8.0后可无缝兼容。
- 缺点:需要配置Binlog,监听程序需稳定运行,对服务器资源有轻微占用。
方案二:准实时增量查询(改进版定时任务)
如果对实时性要求不高(可接受10-30秒延迟),这种方式实现简单、安全,无需额外配置Binlog。
实现步骤
确保目标表有增量标识
优先使用表中已有的时间戳字段(如created_at),若没有则添加:ALTER TABLE target_table ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;编写增量查询脚本
脚本每次查询上次处理时间之后新增的记录,处理后更新上次处理时间(可存储在文件或数据库中):<?php $db = new mysqli('127.0.0.1', 'query_user', 'password', 'your_database'); $lastProcessFile = __DIR__ . '/last_process_time.txt'; // 获取上次处理时间,默认从当前时间往前推30秒 $lastTime = file_exists($lastProcessFile) ? trim(file_get_contents($lastProcessFile)) : date('Y-m-d H:i:s', time() - 30); $currentTime = date('Y-m-d H:i:s'); // 查询增量记录 $stmt = $db->prepare("SELECT * FROM target_table WHERE created_at > ? AND created_at <= ?"); $stmt->bind_param('ss', $lastTime, $currentTime); $stmt->execute(); $result = $stmt->get_result(); // 处理每条新增记录 while ($row = $result->fetch_assoc()) { require_once __DIR__ . '/path/to/your/handler_script.php'; } // 更新上次处理时间 file_put_contents($lastProcessFile, $currentTime); $db->close();配置Windows定时任务
在Windows任务计划程序中创建定时任务,每隔10-30秒执行一次上述PHP脚本,确保执行权限足够。
优缺点
- 优点:实现简单,无需复杂配置,安全性高(数据库用户仅需SELECT权限),几乎无额外资源占用。
- 缺点:存在固定延迟,不适合要求实时触发的业务场景。
安全性注意事项
- 所有数据库用户遵循最小权限原则,避免授予不必要的权限。
- 调用外部脚本或命令时,使用
escapeshellarg()对参数进行转义,防止命令注入。 - 监听脚本和定时脚本应设置严格的文件权限,避免未授权访问。
内容的提问来源于stack exchange,提问作者Stephen R
相关产品推荐
相关产品推荐

