这是基本设置:
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/