php - PostgreSQL LISTEN/NOTIFY 不工作

标签 php postgresql notify listen

这是基本设置:

  • 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() 不是内置函数,它是为简洁起见添加的。

谢谢

最佳答案

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

尝试:

 query('COMMIT');

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

关于php - PostgreSQL LISTEN/NOTIFY 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314696/

相关文章:

php - Laravel 无法修改排队的作业代码

php - 获取二维数组中的数据

arrays - 从 postgresql 函数返回 BIGINT[]

mysql - MariaDB 创建表 SQL 错误 : 1170

PHP 优化一个很长的 Switch Case 语句

php - 将 laravel jenssegers 连接到 mongodb atlas 集群

postgresql - PostgreSQL OLAP 应用程序的性能提示

Java执行器: How to notify a single waiting thread within the executer?

java - 为什么 notifyAll() 没有唤醒这个例子中的所有线程?

java - 初学者关于Java多线程的问题以及synchronized block 和wait()/notify()的使用