Моя задача в целом
Мне нужно прослушать Postgres изменения таблиц (CRUD), выполненные, например, через менеджер баз данных, такой как DBeaver, и передать обновленные идентификаторы строк в laravel -приводную точку API.
Что у меня есть
Postgres part
В Postgres я создаю таблицу, триггер для своей таблицы и функции, которые обрабатывают событие в postgres side
CREATE TABLE PUBLIC.TBLEXAMPLE
(
KEY1 CHARACTER VARYING(10) NOT NULL,
KEY2 CHARACTER VARYING(14) NOT NULL,
VALUE1 CHARACTER VARYING(20),
VALUE2 CHARACTER VARYING(20) NOT NULL,
CONSTRAINT TBLEXAMPLE_PKEY PRIMARY KEY (KEY1, KEY2)
);
CREATE OR REPLACE FUNCTION PUBLIC.NOTIFY() RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify('myevent', row_to_json(NEW)::text);
RETURN new;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE COST 100;
CREATE TRIGGER TBLEXAMPLE_AFTER
AFTER insert or update or delete
ON PUBLIC.TBLEXAMPLE
FOR EACH ROW
EXECUTE PROCEDURE PUBLIC.NOTIFY();
PHP part
У меня есть скрипт basi c PHP, предназначенный для запуска из CLI. При его запуске я получаю уведомления об обновлениях в таблице PG
<?php
$db = new PDO(
"pgsql:dbname=database host=localhost port=5432", 'postgres', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$db->exec('LISTEN myevent');
echo 'Starting';
while(true) {
while ($result = $db->pgsqlGetNotify(PDO::FETCH_ASSOC, 30000)) {
echo print_r($result, true) . PHP_EOL;
}
}
Вот как это выглядит
![enter image description here](https://i.stack.imgur.com/Y2Rt5.gif)
Вопрос
Как правильно запустить скрипт PHP выше как laravel деталь?
Пожалуйста, укажите мне, что читать, возможно, подобное решение.
Я знаю умные слова, такие как «работник», «очередь», я использую php artisan queue:work
в своем API (пользователь запрашивает конечную точку, которая добавляет задания в очередь). Но в этом случае роль пользователя должна выполнять сценарий php logi c выше.
Мое предложение. Я, вероятно, должен разработать что-то вроде php artisan listen2posrgres
с логикой c сверху и запустить ее аналогично php artisan queue:work
в супервизоре. Может ли это работать?