PostgreSQL LISTEN / NOTIFY无效

时间:2011-03-15 16:21:34

标签: 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);
}

因此,我们添加到jobs表,发出LISTEN并循环30秒,直到我们收到通知我们的工作已完成。

问题是pg_get_notify()永远不会获取守护程序发出的NOTIFY。注意,守护进程发出的NOTIFY发生在php脚本的LISTEN之后,我查了一下。

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

由于

1 个答案:

答案 0 :(得分:1)

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

尝试:

 query('COMMIT');

看看是否会为您发出通知。