You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法修改exe时,MySQL表新增记录触发PHP脚本的方案咨询

可行解决方案

方案一:MySQL二进制日志(Binlog)实时监听

这是最直接的实时触发方式,无需修改现有exe或数据库触发器,且能避开事务未提交的问题(Binlog仅记录已提交的事务)。

配置步骤

  1. 开启并配置MySQL Binlog
    修改MySQL配置文件(my.ini/my.cnf),添加或修改以下参数:

    log_bin = D:/mysql/binlogs/mysql-bin.log  # 替换为你的日志存储路径
    binlog_format = ROW
    server_id = 1  # 唯一ID,不能与其他复制节点重复
    

    重启MySQL服务使配置生效。

  2. 创建专用监听用户
    为监听程序创建最小权限的数据库用户,避免过度授权:

    CREATE USER 'binlog_monitor'@'localhost' IDENTIFIED BY 'strong_password';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'binlog_monitor'@'localhost';
    FLUSH PRIVILEGES;
    
  3. 编写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();
    
  4. 将监听脚本转为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。

实现步骤

  1. 确保目标表有增量标识
    优先使用表中已有的时间戳字段(如created_at),若没有则添加:

    ALTER TABLE target_table ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
    
  2. 编写增量查询脚本
    脚本每次查询上次处理时间之后新增的记录,处理后更新上次处理时间(可存储在文件或数据库中):

    <?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();
    
  3. 配置Windows定时任务
    在Windows任务计划程序中创建定时任务,每隔10-30秒执行一次上述PHP脚本,确保执行权限足够。

优缺点

  • 优点:实现简单,无需复杂配置,安全性高(数据库用户仅需SELECT权限),几乎无额外资源占用。
  • 缺点:存在固定延迟,不适合要求实时触发的业务场景。

安全性注意事项

  • 所有数据库用户遵循最小权限原则,避免授予不必要的权限。
  • 调用外部脚本或命令时,使用escapeshellarg()对参数进行转义,防止命令注入。
  • 监听脚本和定时脚本应设置严格的文件权限,避免未授权访问。

内容的提问来源于stack exchange,提问作者Stephen R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:25:24