获取 PostgreSQL 的 RAISE NOTICE 的所有通知

2024-04-23

我有一个大数据库函数,它有多行这样

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..'

根据libpq通知文档 http://www.postgresql.org/docs/current/static/libpq-notice-processing.html“默认通知处理函数在 stderr 上打印消息,但应用程序可以通过提供自己的处理函数来覆盖此行为。”

在您的情况下,“应用程序”(php 本身)通过指定自定义通知处理程序(称为_php_pgsql_notice_handler https://github.com/php/php-src/blob/master/ext/pgsql/pgsql.c:

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 = 0, pgsql.log_notices = 1 and E_NOTICE包含在 error_reporting 中。我想通过一些 php 错误处理函数的杂耍,你将能够获得一些东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 PostgreSQL 的 RAISE NOTICE 的所有通知 的相关文章

随机推荐