[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите понять из-за чего проблемы c функцией
GET
Здравствуйте, собственно вот две функции для перехвата ошибок, 1-для большинства, 2-для E_ERROR:

error_reporting(0);
ini_set('error_reporting','0');
ini_set('display_errors', '0');
ini_set('display_startup_errors', '0');
ini_set('ignore_repeated_errors', '1');
function err($type, $msg, $file, $line)
{
$file=' /'.basename($file).':';
file_put_contents('errors.php', ' - '.$type.' - '.$msg.$file.$line."\n", FILE_APPEND);
//exit(" 503 Сайт временно недоступен.");
}
function r_err()
{
$error = error_get_last();
if(isset($error['type']) && $error['type']==E_ERROR)
{
//if(!function_exists('err'))echo 'NO'; else echo 'YES';

err('E_ERROR', $error['message'], $error['file'], $error['line']);
}
}

register_shutdown_function('r_err');
set_error_handler('err');

echo $s+A;// первые две ошибки (несуществующая переменная и константа)

function query($query)
{
if ($result=mysql_query($query)) return $result;
else trigger_error(mysql_error());
}



// 3 ошибка qu2ery - неизвестная функция
if($tr2=qu2ery("SELECT `p` FROM `tab` WHERE `id_p`='1' LIMIT 1"))
{
$tr2_i=mysql_fetch_assoc($tr2);
echo $tr2_i['partition'];
}
// 4 ошибка - несуществующее поле `p`


Если 3 ошибку не делать, то ловится 1,2 и 4, как и должно быть
Если сделать 3 ошибку, делается только 1 и 2 (само собой 4 не должна т.к. 3 критичная)

Но почему function r_err() не передает данные в function err()!!! Внутри проверяю, она определена, даже если тупо написать внутри r_err():

file_put_contents('errors.php', '111111111', FILE_APPEND);

то тоже не работает, но если написать echo '11111111'; то работает выводит на экран 111111111.

Почему после прекращения работы скрипта, сработывающая (т.к. register_shutdown_function('r_err');
) r_err() отказывается заносить инфу в файл???

Сижу уже 4 часа с двумя строчками.



Спустя 2 часа, 31 минута, 51 секунда (15.06.2012 - 10:42) killer8080 написал(а):
Цитата
Замечание:

На некоторых веб-серверах рабочая директория скрипта может измениться внутри завершающей функции, например, Apache.




Спустя 1 минута, 12 секунд killer8080 написал(а):
A.B.C.
всегда используй полные пути wink.gif

Спустя 10 минут, 23 секунды (15.06.2012 - 10:52) GET написал(а):
killer8080

+1000! Спасибо!!!

Спустя 9 минут, 54 секунды (15.06.2012 - 11:02) GET написал(а):
Хотел еще спросить.

Вот если прикрутить к E_ERROR такой кусок:
 || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR))
{
if (strpos($error['message'], 'Allowed memory size') === 0)
{// если кончилась память
ini_set('memory_limit', (intval(ini_get('memory_limit'))+64)."M"); // выделяем немножко что бы доработать корректно
Log::error("PHP Fatal: not enough memory in ".$error['file'].":".$error['line']);
}
else
{
Log::error("PHP Fatal: ".$error['message']." in ".$error['file'].":".$error['line']);
}
// ... завершаемая корректно ....
}


Корректно ли увеличивать память?

И как можно имитировать такую ошибку? И почему E_PARSE будет работать только для инкюдиемых файлов?

Спустя 1 час, 22 минуты, 33 секунды (15.06.2012 - 12:25) killer8080 написал(а):
A.B.C.
если ошибка возникла из-за нехватки памяти, то дергать ini_set() уже поздно. Кстати не факт что шатдаоун функция вообще будет вызвана.
ИМХО лучший вариант - буферизация вывода, и предварительное резервирование памяти в переменной.

Спустя 13 минут, 45 секунд (15.06.2012 - 12:39) GET написал(а):
Понятно. Спасибо еще раз.


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.