我如何在 Laravel 中“监听”数据库的外部更改

问题描述 投票:0回答:3

如何捕获 Laravel 中第三方应用程序所做的数据库更改?实际上,当第 3 方应用程序将新数据插入数据库时,我必须捕获它。

laravel mariadb
3个回答
1
投票

我认为你不能,至少从 Laravel 本身的角度来看。

在关系数据库上,您可以在要监视更改的表上创建多个触发器,然后使正在调用的存储过程以某种方式通知 Laravel。

但是,正如您所看到的,它涉及应用程序中比 Laravel 本身更多的部分。 此外,它还有自己的缺点。例如,数据库必须了解有关第三个应用程序正在使用的Laravel或任何框架。

我不知道这个解决方案是否适合您,但这是我可以给您的最佳选择


0
投票

基本上,你不能。相反,您需要第三方应用程序以某种方式通知您的 Laravel 应用程序已进行更改。

如果第三方应用程序支持 Webhooks,这可能是一种可行的方法。或者,如果它可以将通知推送到 Redis 之类的东西,那也可能有效。

但听起来你可能正在做一些坏主意。除非在非常有限的情况下,两个应用程序不应该真正共享数据库。


0
投票

我想你可以通过启用Mysql二进制日志记录来做到这一点

  1. 打开MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/my.cnf)。
  2. 添加或修改以下行:

[mysqld]
log_bin = /var/log/mysql/mysql-bin.log # 启用二进制日志记录
binlog_format = ROW # 使用基于行的日志记录进行精确更改
server_id = 1 # 用于复制的唯一服务器 ID

重新启动MySQL:
sudo systemctl 重新启动 mysql

使用 symfony/process php 包运行读取二进制日志的 MySQL 客户端命令,然后在 Laravel 中解析这些日志。

创建一个 Laravel 命令来监听 Binlogs
php artisan make:命令 ListenToBinlog

更新ListenToBinlog命令以开始监听binlog更改。

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Symfony\Component\Process\Process;

class ListenToBinlog extends Command
{
    protected $signature = 'db:listen-binlog';
    protected $description = 'Listen for changes in the MySQL binary log';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $this->info("Listening to MySQL binary log...");

        // Use mysqlbinlog command to read the binary log in real-time
        $process = new Process(['mysqlbinlog', '-R', '-h', '127.0.0.1', '-u', 'your_user', '-p', '--read-from-remote-server', '--base64-output=DECODE-ROWS', '--verbose', 'mysql-bin.000001']);
        $process->setTimeout(0);
        $process->setIdleTimeout(0);

        $process->start();

        foreach ($process as $type => $data) {
            if ($process::OUT === $type) {
                // Process each line of binlog
                if (strpos($data, 'INSERT INTO') !== false || strpos($data, 'UPDATE') !== false || strpos($data, 'DELETE FROM') !== false) {
                    // Parse the SQL command and handle it in Laravel
                    $this->info("Change detected: " . $data);
                    // Trigger events, or handle specific actions here
                }
            }
        }

        return 0;
    }
}

此命令使用 mysqlbinlog 从 MySQL 读取二进制日志并侦听特定更改,例如 INSERT、UPDATE 和 DELETE。
修改命令中的数据库凭据以匹配您的设置(-h、-u、-p)。

手动运行命令或将其添加到您的计划中以持续监听更改。

php artisan db:listen-binlog

© www.soinside.com 2019 - 2024. All rights reserved.