以下是基本设置:
因此,我认为问题在于PHP脚本。以下是相关代码:
所以我们向jobs表中添加内容,发出一个LISTEN命令,并循环30秒直到收到通知表示我们的任务已经完成。
问题在于pg_get_notify()永远无法获取守护程序发出的NOTIFY。请注意,守护程序发出的NOTIFY是在php脚本进行LISTEN操作之后发生的,我已经检查过了。
我有没有做错什么?顺便说一下,我非常清楚query()不是内置函数,只是为了简洁而添加的。
谢谢。
一个PHP脚本将数据写入数据库表,并发出
NOTIFY job_added
。然后它开始通过发出LISTEN job_complete
来等待响应。守护程序(用C语言编写)已经发出了
LISTEN jod_added
,因此会被唤醒并处理该表。守护进程处理表格并将结果写入结果表中,然后调用
NOTIFY job_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);
}
所以我们向jobs表中添加内容,发出一个LISTEN命令,并循环30秒直到收到通知表示我们的任务已经完成。
问题在于pg_get_notify()永远无法获取守护程序发出的NOTIFY。请注意,守护程序发出的NOTIFY是在php脚本进行LISTEN操作之后发生的,我已经检查过了。
我有没有做错什么?顺便说一下,我非常清楚query()不是内置函数,只是为了简洁而添加的。
谢谢。
sleep
,usleep
或者time_sleep_until
来代替循环直到时间结束的方法。 - Charlessnprintf(buf, sizeof(buf), "NOTIFY job_complete%d", job_id);
,然后从libpq调用PQexec(conn, buf);
。 - tbh1