Intereting Posts
Как скопировать базу данных с одного сервера на другой сервер в PHP? Что вызывает отказ в разрешении при удалении файлов? данные о трубопроводах в командной строке php? preg_replace удалить специальные символы Как создать простой модуль Hello World в Magento? Запуск задания cron в CodeIgniter и Hostgator Как добавить класс в ссылку в wp_nav_menu? Как застегнуть 100 мб файлов во время (до) загрузки, чтобы скорость загрузки могла быть увеличена? Вставить массив в базу данных в одну строку Как я могу наложить водяной знак на уже измененный образ на PHP (используя GD)? Сеанс PHP истекает немедленно, когда часы клиента установлены в будущем Пользовательские поля Woocommerce не будут обновляться, когда я оставлю их пустыми и покажут пустые поля Преобразование strtotime в формат даты в php Карты Google V3, перекрывающие маркеры, на точное местоположение Общий обход дерева (бесконечный) в режиме поиска в ширину

Получите все уведомления об уведомлении PostgreSQL о повышении

У меня есть большая функция БД, которая имеет несколько строк, подобных этому

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

Related of "Получите все уведомления об уведомлении PostgreSQL о повышении"

Согласно документации уведомления 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-манипуляции вы сможете что-то получить.