Вот базовая настройка:
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 () не является встроенной функцией, она была добавлена для краткости.
Спасибо