【问题标题】:Get all notices of PostgreSQL's RAISE NOTICE获取所有关于 PostgreSQL 的 RAISE NOTICE 的通知
【发布时间】:2014-01-14 09:36:37
【问题描述】:

我有一个大的 DB 函数,它有多个这样的行

RAISE NOTICE 'some step completed';

我想在我的 PHP 应用程序中获得所有这些通知。我发现只有pg_last_notice() 函数,它只返回最后的通知。

有什么办法可以得到所有的通知吗?


示例: 数据库功能:

CREATE OR REPLACE FUNCTION do_smth()
  RETURNS void AS
$BODY$

BEGIN

-- some actions
RAISE NOTICE 'Result of the actions:...';
-- some other actions
RAISE NOTICE 'Result of the other actions..';

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

PHP 代码:

<?php
// ...
$db->exec("SELECT do_smth()"); // executing DB function

$last_notice = pg_last_notice($db_connection); 
// returns 'NOTICE: Result of the other actions..'

【问题讨论】:

  • 你能说得更具体点吗?你有一些代码要显示吗?
  • @FabrizioMazzoni:他确实显然尝试过pg_last_notice()
  • @FabrizioMazzoni 我已经更新了问题

标签: php postgresql


【解决方案1】:

根据libpq notice documentation“默认通知处理函数在stderr上打印消息,但应用程序可以通过提供自己的处理函数来覆盖此行为。”

在您的情况下,“应用程序”(php 本身)通过指定名为 _php_pgsql_notice_handler 的自定义通知处理程序来覆盖此行为:

Line #1367: PQsetNoticeProcessor(pgsql, _php_pgsql_notice_handler, (void*)Z_RESVAL_P(return_value));

这意味着 PostgreSQL 通知不会进一步传播到 stderr,而是由该处理程序捕获和处理。

在处理程序本身(第 #827 行)中,您可以看到每次发出通知时,php 都会更新保存它的变量,并且不会将值附加到某个数组。因此,最后只有最后一条通知出现在该变量中,可通过calling pg_last_notice() 获得。

因此,似乎无法从 PHP 中获取以前的 PostgreSQL 通知。

但是,如果您进一步查看同一个通知处理程序,您会发现它正在将通知写入错误日志,以防 pgsql.ignore_notices = 0pgsql.log_notices = 1E_NOTICE 包含在 error_reporting 中。我想通过一些 php 错误处理函数的杂耍你将能够获得一些东西。

【讨论】:

  • 那里有很好的解释。当人们找到源头时,我总是很高兴。
  • 感谢您的回答。我尝试了几个小时从错误处理程序获取数据库通知,但没有成功。
  • 在 PHP CLI 中尝试 ini_set("pgsql.log_notice", 1) 似乎失败了,没有任何解释。可能是什么原因?
【解决方案2】:

pg_last_notice() 现在接受一个可选参数来指定一个操作。

这可以通过以下新常量之一来完成:

  • PGSQL_NOTICE_LAST:返回最后通知
  • PGSQL_NOTICE_ALL:返回所有通知
  • PGSQL_NOTICE_CLEAR:清除通知

有关 7.1 版中更改功能的更多信息HERE

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多