PostgreSQL LISTEN / NOTIFY не работает - PullRequest
3 голосов
/ 15 марта 2011

Вот базовая настройка:

  • PHP-скрипт записывает в таблицу в базе данных и затем выдает NOTIFY job_added.Затем он начинает прослушивать ответ, выдавая LISTEN job_complete

  • Демон (написанный на C) уже выпустил LISTEN jod_added и, следовательно, просыпается и обрабатывает таблицу.

  • Демон обрабатывает таблицу и записывает результаты в таблицу результатов перед вызовом NOTIFY job_complete

  • Затем сценарий PHP активизируется и получает результат изТаблица результатов.

Все, кроме последнего шага, работают.Демон использует libpq, и я проверил успешность NOTIFY, выданного демоном, как только он добавил результат в таблицу результатов.

Так что я думаю, что проблема заключается в PHP-скрипте.Вот код ошибки:

$id = query("INSERT into jobs_table (/* details not important */) VALUES (/* */) RETURNING id");

query("NOTIFY job_added");
//daemon wakes up and does its thing.

query("LISTEN job_complete".$id);

$time = time();
while((time() - $time) < 30) {
    $notify = pg_get_notify($conn);
    if($notify) {
        // Never gets here
        if($notify['message']=="job_complete".$id) {
            //our job has completed
            break;
        }
    }
    usleep(25000);
}

Итак, мы добавляем в таблицу заданий, запускаем LISTEN и выполняем цикл в течение 30 секунд, пока не получим уведомление о том, что наша работа выполнена.

проблема в том, что pg_get_notify() никогда не получает NOTIFY, выданный демоном.Обратите внимание, что NOTIFY, выданный демоном, происходит после LISTEN скрипта php, я проверил.

Есть ли что-то, что я делаю, что совершенно не так?Кстати, я хорошо знаю, что query () не является встроенной функцией, она была добавлена ​​для краткости.

Спасибо

1 Ответ

1 голос
/ 13 марта 2013

Я бы поспорил, что проблема в том, что вы не совершаете транзакцию. Уведомления генерируются при коммите.

Попытка:

 query('COMMIT');

Посмотрите, вызывает ли это уведомление для вас.

...