У меня есть большая функция БД, которая имеет несколько строк, подобных этому
RAISE NOTICE 'some step completed';
Я хочу получить все эти уведомления в моем приложении PHP. Я нашел только pg_last_notice()
которая возвращает только последнее уведомление.
Есть ли способ получить все уведомления?
Пример: функция DB:
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 «Функция обработки уведомлений по умолчанию выводит сообщение на 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()
.
Таким образом, похоже, что получить предыдущие уведомления PostgreSQL из PHP невозможно.
Однако, если вы посмотрите дальше на тот же обработчик уведомлений, вы увидите, что он записывает уведомления в журнал ошибок, в случае, если pgsql.ignore_notices = 0
, pgsql.log_notices = 1
и E_NOTICE
включен в error_reporting. Я думаю, что с некоторыми функциями обработки ошибок php-манипуляции вы сможете что-то получить.