Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: про ошибки
 
 автор: localGhost   (10.05.2005 в 05:28)   письмо автору
 
 

вобщем ситуация такая: как когда-то говорил, работаю над собственной системой статистики. Так вот, хочу сделать чтоб в случае возникновения какихлибо ошибок скрипт сам забивал данные лог, чтоб не пологаться на добропорядочных граждан. Как отследить 401, 403 и 404 ошибки я уже продумал. Теперь хочу зафиксировать php и mySQL ошибки. Как собрать сообщения, допустим , в массив но при этом чтоб они не выводились на странице?

И еще: в случае 500 ошибки сервера, никакие php скрипты выполняться не будут?

   
 
 автор: glsv (Дизайнер)   (10.05.2005 в 06:36)   письмо автору
 
   для: 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 
"Запрос невыполнен";
  }
?>

   
 
 автор: localGhost   (10.05.2005 в 17:01)   письмо автору
 
   для: glsv (Дизайнер)   (10.05.2005 в 06:36)
 

ладно понятно... как насчет ошибки 500? и ошибки (которая почему-то часто появляеться на вашем форуме) No response from aplication server. как считаете можно отловить эти ошибки? зафиксировать php скритом? ведь в случае этих ошибок как я понимаю падает сервер?

   
 
 автор: glsv (Дизайнер)   (11.05.2005 в 05:09)   письмо автору
 
   для: 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($handledate('d.m.y H:m:s')." ".$page." ".$ip."\n");
   
fclose($handle);    
 }
?>

И все 500-е ошибки записываются в файл, который можно посмотреть на досуге.

>ошибки (которая почему-то часто появляеться на вашем форуме) No response from aplication server
Здесь поделать ничего нельзя, т.к. сервер в этом момент не отвечает и никакой код (даже html-страницы) выполнен быть не может..

   
 
 автор: localGhost   (11.05.2005 в 15:24)   письмо автору
 
   для: glsv (Дизайнер)   (11.05.2005 в 05:09)
 

т.е. в случае ошибки 500 не означает что сервер заглох намертво и выполнение каких-либо скриптов невозможно? что она вообще из себя представляет?

З.Ы. а как съемитировать эту ошибку? чтоб поэксперементировать...

З.З.Ы. а какие еще порекомендовали бы забит под контроль?

   
 
 автор: cheops   (11.05.2005 в 22:36)   письмо автору
 
   для: localGhost   (11.05.2005 в 15:24)
 

Если сервер способен отправлять сообщение об ошибке, значит он ещё не заглох намертво. Ошибка 500 означает не только внутреннюю ошибку сервера - в большинстве случаев, это означает неправильную конфигурацию, это может быть и ошибка в конфигурационном файле .htaccess и ошибка при "горячей" замене файлов сервера.

   
 
 автор: glsv (Дизайнер)   (12.05.2005 в 04:33)   письмо автору
 
   для: localGhost   (11.05.2005 в 15:24)
 

>т.е. в случае ошибки 500 не означает что сервер заглох намертво и выполнение каких-либо скриптов невозможно?
Иногда да, иногда нет. Даже в htaccess можно такую ерунду написать, что сервер виснет намертво.

>За как съемитировать эту ошибку? чтоб поэксперементировать...
Хотел посоветовать поэкспериментируйте с файлами htacccess, но все мои эксперименты сейчас закончились полным падением Apache. Если что придумаю – напишу.

> а какие еще порекомендовали бы забит под контроль?
Все остальные встречаются значительно реже. Мне кажется, что этих (401, 403, 404, 500) вполне хватит.

   
 
 автор: localGhost   (12.05.2005 в 14:39)   письмо автору
 
   для: glsv (Дизайнер)   (12.05.2005 в 04:33)
 

спасибо за ответы.

>но все мои эксперименты сейчас закончились полным падением
>Apache.

страху нет - все гонаю на локалке, чего можно написать?
или под словом падение ты подразумеваеш что апач умер напроч? ))) надеюсь переустанавливать его не придеться?))

   
 
 автор: glsv (Дизайнер)   (13.05.2005 в 05:23)   письмо автору
 
   для: localGhost   (12.05.2005 в 14:39)
 

>или под словом падение ты подразумеваеш что апач умер напроч? )
Ну нет. Это я слишком сгустил краски :) Просто мне не удалось получить обработку 500 ошибки. Apache отказывался это делать.

Вообще то я ее получил искусственно. Я как раз экспериментировал с модулем для Apache под названием mod_security. В нем можно настраивать запреты на содержимое запросов и выполнять различные действия при срабатывании фильтров.
Одним из действий может быть выдача 500 ошибки.

Если есть желание поэкспериментировать, то вот адрес домашней странички модуля:
http://www.modsecurity.org

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования