【问题标题】:PostgreSQL LISTEN/NOTIFY not workingPostgreSQL LISTEN/NOTIFY 不工作
【发布时间】:2023-04-01 23:40:01
【问题描述】:

这是基本设置:

  • 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发生在php脚本的LISTEN之后,我检查了。

我在做什么是完全错误的?顺便说一句,我很清楚 query() 不是内置函数,它是为了简洁而添加的。

谢谢

【问题讨论】:

  • 您可能希望使用sleepusleeptime_sleep_until,而不是在时间用完之前运行循环。
  • 也许您是在“job_complete”而不是“job_complete”.$id 上通知的?
  • brian-l:恐怕不行。在守护进程中,我基本上执行snprintf(buf, sizeof(buf), "NOTIFY job_complete%d", job_id);,然后从libpq 调用PQexec(conn, buf);
  • 问题已解决。我没有将连接句柄传递给 pg_get_notify,而是传递了一个数据库对象(用于自定义类)。傻我!道歉。
  • 您可以考虑将其发布为将来参考的答案

标签: php postgresql notify listen


【解决方案1】:

我敢打赌,问题在于您没有提交交易。提交时发出通知。

试试:

 query('COMMIT');

看看这是否会为您引发通知。

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 2014-02-04
    • 2013-04-30
    • 2018-01-07
    • 2015-12-31
    • 2016-10-21
    • 2023-04-09
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多