Как прослушать Postgres прослушать / уведомить в Laravel? - PullRequest
1 голос
/ 17 апреля 2020

Моя задача в целом

Мне нужно прослушать 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

Вопрос

Как правильно запустить скрипт PHP выше как laravel деталь?

Пожалуйста, укажите мне, что читать, возможно, подобное решение.

Я знаю умные слова, такие как «работник», «очередь», я использую php artisan queue:work в своем API (пользователь запрашивает конечную точку, которая добавляет задания в очередь). Но в этом случае роль пользователя должна выполнять сценарий php logi c выше.

Мое предложение. Я, вероятно, должен разработать что-то вроде php artisan listen2posrgres с логикой c сверху и запустить ее аналогично php artisan queue:work в супервизоре. Может ли это работать?

...