Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] error_log - plik loga niedostępny
Forum PHP.pl > Forum > PHP
bulimaxiu
Witam.

Mam klasę typu errorhandler. error_log zapisuje błędy do pliku
  1. error_log ($err, 3, $this->log_filename);
W __destruct jest funkcja w której sprawdzam
  1. is_file($this->log_filename)
która zwraca FALSE. Gdy w tym samym skrypcie zapytam o historyczny log to zwraca TRUE i jest OK. file_exists - podobnie.

Czy ten error_log buforuje log i po zakończeniu skryptu dopiero go zapisuje?
Fifi209
Nie dałeś kodu, mamy zgadywać jak to napisałeś?
bulimaxiu
  1. function __destruct () {
  2. if (is_file($this->log_filename)) { // return false
  3. // Packing log file into ZIP package
  4. require_once ('zip.class.php');
  5. $zipfile = new zipfile;
  6. $zipfile->create_file(file_get_contents ($this->log_filename), basename($this->log_filename));
  7. file_put_contents ([b]$this->log_filename_zip[/b], $zipfile->zipped_file());
  8. unSet ($zipfile);
  9. unlink ($this->log_filename); // Comment this line if You don't want delete original html file.
  10. }
  11.  
  12. // Sending e-mail
  13. if ($this->send_mail == true AND (empty($this->send_deadline) OR (strtotime($this->send_deadline) > strtotime($this->date)))) {
  14. // ........
  15. $this->SendMail(); // return error with $this->log_filename_zip
  16. }
  17. }
  1. public function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars='') {
  2. $err = file_get_contents ($this->ROOT . 'errorhandler_log.tpl');
  3. $search = Array ('$errno$', '$errmsg$', '$filename$', '$linenum$', '$vars$', '$id$');
  4. $replace = Array ($errno, $errmsg, $filename, $linenum, print_r($vars, 1), $id);
  5. $err = str_replace ($search, $replace, $err);
  6.  
  7. error_log ($err, 3, $this->log_filename);
  8. }
  9. }
erix
Zacznij od wywołania tej funkcji samodzielnie, nie w destruktorze, bo w tej metodzie lubią się dziać niezłe jaja z operacjami I/O.
bulimaxiu
Ręczne odpalenie serErrorHandler(999, 'msg', 'file', '$linenum', '$vars') powoduje, że destruktor działa prawidłowo - znajduje plik i wysyła maila.
Dla jasności dodam 2 rzeczy:
1. gdy wyeliminuję przyczynę błędu w kodzie, procedura się nie odpala - prawidłowo.
2. po zakończeniu skryptu plik log pojawia się w miejscu w którym miał się pojawić.

z automatu funkcja odpala się kodem
  1. set_error_handler(Array($GLOBALS['eh'], 'userErrorHandler'), E_ALL);

Pozdrawiam.
erix
Cytat
Ręczne odpalenie serErrorHandler(999, 'msg', 'file', '$linenum', '$vars') powoduje, że destruktor działa prawidłowo - znajduje plik i wysyła maila.
Dla jasności dodam 2 rzeczy:

Nie mówisz nam wszystkiego.

Cytat
Ręczne odpalenie

Mam na myśli ręczne odpalanie kodu, który jest w destruktorze.
bulimaxiu
Ręczne odpalenie kodu, który jest w destruktorze (poprzez wywołanie __destruct() ze skryptu jak zwykłej funkcji) powoduje zgłoszenie podwójnego komunikatu o nieznalezieniu pliku do przesłania.

Staram się przekazać konkrety, nikt nie chce chyba całej klasy analizować i zbędnego wydaje mi się kodu do tego problemu.
Fifi209
Mam dziwne przeczucie, że chodziło o przerzucenie kodu destruktora do nowej funkcji i jej odpalenie.
bulimaxiu
Też tak zrobiłem, ale zachowanie było dokładnie takie samo: odwołanie się do pliku logu przed zakończeniem skryptu kończy się brakiem dostępu do pliku logu. Można to oczywiście obejść funkcją z fopen, ale chciałbym zrozumieć czemu tak się dzieje, bo w manualu nic o tym nie ma (bufor też czyściłem).
erix
Na serwerze z innym systemem operacyjnym dzieje się to samo?
bulimaxiu
Tak. localhost WindowsXP (Vertrigo) PHP 5.3.6 oraz współdzielony Linux PHP 5.2.14
--------
Wyjaśnione. Przyczyną był błąd powstający w klasie errorhandler w sekcji wysyłania maila z raportem, ale już po obsłudze błędów (__destruct).
Gdy błąd występował wcześniej, plik się tworzył i wszystko było OK. Gdy błąd wystąpił tylko w __destruct, plik raportu się tworzył już po jego obsłudze wstępnej, w związku z czym pliku fizycznie jeszcze nie było. Jednak na dysku tuż po tym plik się pojawiał, tylko już nie był obsługiwany przez skrypt.
Wniosek: w errorhandlerze nie może być drobnego błędu.

Błąd logiczny, zawiły, ale wyjaśniony.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.