Php PostgreSQL侦听/通知不工作
以下是基本设置:Php PostgreSQL侦听/通知不工作,php,postgresql,notify,listen,Php,Postgresql,Notify,Listen,以下是基本设置: PHP脚本写入数据库中的表,然后发出notifyjob\u added。然后,它通过发出listenjob\u complete 一个守护进程(用C编写)已经发出了一个LISTEN jod_added,因此会唤醒并处理该表 在调用NOTIFY job\u complete 然后,PHP脚本将唤醒并从结果表中检索结果 除了最后一步之外,其他一切都在起作用。后台程序使用libpq,我已经检查了后台程序在将结果添加到结果表后发出的NOTIFY是否成功 所以我认为问题在于PHP脚本
- PHP脚本写入数据库中的表,然后发出
。然后,它通过发出notifyjob\u added
listenjob\u complete
- 一个守护进程(用C编写)已经发出了一个
,因此会唤醒并处理该表LISTEN jod_added
- 在调用
NOTIFY job\u complete
- 然后,PHP脚本将唤醒并从结果表中检索结果
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);
}
$id=query(“插入到jobs_表(/*详细信息不重要*/)值(/***/)返回id”);
查询(“添加通知作业”);
//守护进程醒来并执行其操作。
查询(“侦听作业完成”。$id);
$time=time();
而((time()-$time)<30){
$notify=pg_get_notify($conn);
如果($通知){
//永远不会到这里
如果($notify['message']==“作业完成”。$id){
//我们的工作已经完成了
打破
}
}
美国LEEP(25000);
}
因此,我们添加到jobs表中,发出一个侦听
并循环30秒,直到收到任务完成的通知
问题是,pg\u get\u notify()
从不拾取守护进程发出的notify
。注意,守护进程发出的NOTIFY
是在php脚本执行LISTEN
之后发生的,我选中了
我做的任何事情都是完全错误的吗?顺便说一句,我很清楚query()不是内置函数,它是为了简洁而添加的
谢谢我愿意打赌问题在于您没有提交交易。在提交时引发通知 尝试:
看看这是否会给您带来通知。您可能想使用,或者在时间用完之前不运行循环。也许您是在“作业完成”而不是“作业完成”上发出通知。$id?brian-l:恐怕不会。在守护进程中,我基本上执行snprintf(buf,sizeof(buf),“notifyjob_complete%d”,job_id)编码>然后调用
PQexec(conn,buf)代码>来自libpq。问题已解决。我没有将连接句柄传递给pg_get_notify,而是传递了一个数据库对象(对于自定义类)。我真傻!抱歉,你可以考虑把这个作为将来的参考答案。
query('COMMIT');