|
|
|
| вобщем ситуация такая: как когда-то говорил, работаю над собственной системой статистики. Так вот, хочу сделать чтоб в случае возникновения какихлибо ошибок скрипт сам забивал данные лог, чтоб не пологаться на добропорядочных граждан. Как отследить 401, 403 и 404 ошибки я уже продумал. Теперь хочу зафиксировать php и mySQL ошибки. Как собрать сообщения, допустим , в массив но при этом чтоб они не выводились на странице?
И еще: в случае 500 ошибки сервера, никакие php скрипты выполняться не будут? | |
|
|
|
|
|
|
|
для: localGhost
(10.05.2005 в 05:28)
| | Из того что пришло в голову:
Использовать функции буферизации вывода. Искать в текcте ключевые слова и фразы, которые могут обозначать ошибку и если такие слова найдены, то проводить обработку, например, записывать страницу с ошибкой в файл.
<?php
function callback($buffer)
{
$pos = strpos($buffer, "Error");
if ($pos === false) {
// Ошибок не найдено
$buffer .= "Нет";
} else {
$buffer .= "Да";
// Подозрнеие на ошибку
// Далее обработка, можно, например, записать эту страницу в файл
$filename="../errors/".date("Y_m_d_His",time()).".html";
$handle = fopen($filename, 'w');
fwrite($handle, $buffer);
fclose($handle);
}
// Возвращаем буфер
return ($buffer);
}
// Включаем буферизацию вывода
ob_start("callback");
////////////////////////
// Код страницы
////////////////////////
// Сбрасываем буфер и выводим его содержимое
ob_end_flush();
?>
|
В данном примере использовано ключевое слово Error, как исгнализатор ошибок в php-коде.
Но следует учесть, для того, чтобы вывести ошибку в файл, скрипт, который вызвал ошибку не должен прерываться. Иначе функция обратного вызова сможет уловить наличие ошибки, но просигнализовать об этом не сможет - php-код прекратит выполнение.
Я вот что имею ввиду. Например, есть конструкция:
<?
$query="SELECT * FROM table ...";
if (!mysql_query($query))
{
echo "Запрос невыполнен";
exit();
}
?>
|
Т.е. при возникновении ошибки выполнение кода останавливается. Для того, чтобы работал вышеприведенный код улавливания ошибок exit-ов быть не должно.
<?
$query="SELECT * FROM table ...";
if (!mysql_query($query))
{
echo "Запрос невыполнен";
}
?>
|
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(10.05.2005 в 06:36)
| | ладно понятно... как насчет ошибки 500? и ошибки (которая почему-то часто появляеться на вашем форуме) No response from aplication server. как считаете можно отловить эти ошибки? зафиксировать php скритом? ведь в случае этих ошибок как я понимаю падает сервер? | |
|
|
|
|
|
|
|
для: localGhost
(10.05.2005 в 17:01)
| | Учитывать подобные ошибки с помощью php можно.
В файле .htaccess прописываем обработчики ошибок
ErrorDocument 401 401.php
ErrorDocument 403 403.php
ErrorDocument 500 500.php
|
Т.е. при появлении ошибок с соответствующими кодами будет произведена переадресация на соответствующие скрипты.
В этих скриптах пишем удобоваримые сообщения для посетителей и адрес, вызвавший ошибку, записываем в файл.
Например, вот так для 500 ошибки.
<?
$serv = $_SERVER["SERVER_NAME"];
$page = "http://".$serv.$_SERVER['REQUEST_URI'];
$ip = $_SERVER['REMOTE_ADDR'];
$forward = getenv(HTTP_X_FORWARDED_FOR);
if (($forward != NULL)&&($forward != $ip)) $ip = $ip."/".$forward;
$handle = fopen("../../500.txt", "a");
if ($handle)
{
fwrite($handle, date('d.m.y H:m:s')." ".$page." ".$ip."\n");
fclose($handle);
}
?>
|
И все 500-е ошибки записываются в файл, который можно посмотреть на досуге.
>ошибки (которая почему-то часто появляеться на вашем форуме) No response from aplication server
Здесь поделать ничего нельзя, т.к. сервер в этом момент не отвечает и никакой код (даже html-страницы) выполнен быть не может.. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(11.05.2005 в 05:09)
| | т.е. в случае ошибки 500 не означает что сервер заглох намертво и выполнение каких-либо скриптов невозможно? что она вообще из себя представляет?
З.Ы. а как съемитировать эту ошибку? чтоб поэксперементировать...
З.З.Ы. а какие еще порекомендовали бы забит под контроль? | |
|
|
|
|
|
|
|
для: localGhost
(11.05.2005 в 15:24)
| | Если сервер способен отправлять сообщение об ошибке, значит он ещё не заглох намертво. Ошибка 500 означает не только внутреннюю ошибку сервера - в большинстве случаев, это означает неправильную конфигурацию, это может быть и ошибка в конфигурационном файле .htaccess и ошибка при "горячей" замене файлов сервера. | |
|
|
|
|
|
|
|
для: localGhost
(11.05.2005 в 15:24)
| | >т.е. в случае ошибки 500 не означает что сервер заглох намертво и выполнение каких-либо скриптов невозможно?
Иногда да, иногда нет. Даже в htaccess можно такую ерунду написать, что сервер виснет намертво.
>За как съемитировать эту ошибку? чтоб поэксперементировать...
Хотел посоветовать поэкспериментируйте с файлами htacccess, но все мои эксперименты сейчас закончились полным падением Apache. Если что придумаю – напишу.
> а какие еще порекомендовали бы забит под контроль?
Все остальные встречаются значительно реже. Мне кажется, что этих (401, 403, 404, 500) вполне хватит. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(12.05.2005 в 04:33)
| | спасибо за ответы.
>но все мои эксперименты сейчас закончились полным падением
>Apache.
страху нет - все гонаю на локалке, чего можно написать?
или под словом падение ты подразумеваеш что апач умер напроч? ))) надеюсь переустанавливать его не придеться?)) | |
|
|
|
|
|
|
|
для: localGhost
(12.05.2005 в 14:39)
| | >или под словом падение ты подразумеваеш что апач умер напроч? )
Ну нет. Это я слишком сгустил краски :) Просто мне не удалось получить обработку 500 ошибки. Apache отказывался это делать.
Вообще то я ее получил искусственно. Я как раз экспериментировал с модулем для Apache под названием mod_security. В нем можно настраивать запреты на содержимое запросов и выполнять различные действия при срабатывании фильтров.
Одним из действий может быть выдача 500 ошибки.
Если есть желание поэкспериментировать, то вот адрес домашней странички модуля:
http://www.modsecurity.org | |
|
|
|