Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PostgreSQL侦听/通知不工作_Php_Postgresql_Notify_Listen - Fatal编程技术网

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脚本将唤醒并从结果表中检索结果

除了最后一步之外,其他一切都在起作用。后台程序使用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);
}
$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');