3

这是基本设置:

  • PHP 脚本写入数据库中的表,然后发出NOTIFY job_added. 然后它开始通过发出LISTEN job_complete

  • 一个守护进程(用 C 语言编写)已经发出 aLISTEN 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守护进程发出的消息发生在LISTENphp 脚本之后,我检查了。

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

谢谢

4

1 回答 1

3

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

尝试:

 query('COMMIT');

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

于 2013-03-13T12:54:43.173 回答