如何捕获 Laravel 中第三方应用程序所做的数据库更改?实际上,当第 3 方应用程序将新数据插入数据库时,我必须捕获它。
我认为你不能,至少从 Laravel 本身的角度来看。
在关系数据库上,您可以在要监视更改的表上创建多个触发器,然后使正在调用的存储过程以某种方式通知 Laravel。
但是,正如您所看到的,它涉及应用程序中比 Laravel 本身更多的部分。 此外,它还有自己的缺点。例如,数据库必须了解有关第三个应用程序正在使用的Laravel或任何框架。
我不知道这个解决方案是否适合您,但这是我可以给您的最佳选择
基本上,你不能。相反,您需要第三方应用程序以某种方式通知您的 Laravel 应用程序已进行更改。
如果第三方应用程序支持 Webhooks,这可能是一种可行的方法。或者,如果它可以将通知推送到 Redis 之类的东西,那也可能有效。
但听起来你可能正在做一些坏主意。除非在非常有限的情况下,两个应用程序不应该真正共享数据库。
我想你可以通过启用Mysql二进制日志记录来做到这一点
[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