2014-01-14 3 views
2

У меня есть большая функция DB, которая имеет несколько линий, как этотПолучить все уведомления воскрешения УВЕДОМЛЕНИЯ в 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..' 
+0

Не могли бы вы уточнить? У вас есть код для показа? –

+0

@FabrizioMazzoni: он * сделал *, очевидно, попробовал 'pg_last_notice()'. –

+0

@FabrizioMazzoni Я обновил вопрос – alex23

ответ

3

По данным «обработки по умолчанию уведомление функции libpq notice documentation печатает сообщение на поток ошибок, но приложение может переопределите это поведение, предоставив свою собственную функцию обработки ».

В вашем случае «приложение» (сам PHP) является переопределением этого поведения, указав обработчик уведомления, называется _php_pgsql_notice_handler:

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

Это означает, что PostgreSQL уведомление не распространяется дальше в поток ошибок, но захватывается и обрабатывается этим обработчиком.

В самом обработчике (строка # 827) вы можете видеть, что каждый раз, когда выдается уведомление, php обновляет переменную, удерживая ее, и не добавляет значение к некоторому массиву. Следовательно, в конце только последнее уведомление присутствует в этой переменной, доступной по calling pg_last_notice().

Так что, как представляется, невозможно получить предыдущие уведомления PostgreSQL из PHP.

Однако, если смотреть дальше в тот же обработчик уведомления, вы увидите, что он пишет о извещениях в журнал ошибок, в случае pgsql.ignore_notices = 0, pgsql.log_notices = 1 и E_NOTICE входят в error_reporting. Я думаю, что с некоторыми функциями обработки ошибок php-манипуляции вы сможете что-то получить.

+0

Очень приятное объяснение там. Я всегда рад, когда люди просто идут к источнику. –

+0

Спасибо за ответ. Я пробовал несколько часов, чтобы получить извещения об ошибках из обработчика ошибок, но не удался. – alex23

+0

Попытка 'ini_set (« pgsql.log_notice », 1)' в PHP CLI, кажется, не работает без объяснений. Что может быть причиной? –

Смежные вопросы