Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Z manuala (ta sama strona):

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

Edit:
linkowanie pliku = include, czy require - bo to jest różnica ;-)

Edit2:
[tu były głupoty... ]Przemek Szalko edytował(a) ten post dnia 14.04.08 o godzinie 11:18

konto usunięte

Temat: Nasza klasa dalej daje ciała

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
default:
die("Nasza klasa nie bangla");
break;
}

/* Don't execute PHP internal error handler */
return true;
}
set_error_handler("myErrorHandler");
require('nieistniejacy.php');
?>

Przy include efekt dzialania jest ten sam

Edit: nigdy mi to nie było potrzebne jak poprzednicy uważam że biała strona jest ok.Michał Wujas edytował(a) ten post dnia 14.04.08 o godzinie 11:17
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Ok zwracam honor. Mój błąd, ponieważ nie doczytałem dokładnie i żyłem w nieświadomości ;-)
Zwykle nie zwraca się uwagi na takie szczegóły, ale....

require() and include() are identical in every way except how they handle failure. They both produce a Warning, but require() results in a Fatal Error.

Tutaj Fatal Error = system zwraca E_WARNING i dodatkowo zatrzymuje wykonywanie strony. Wcześniej interpretowałem to jako E_ERROR, bo nigdy aż tak się w to nie wgłębiałem :-)

Zatem error_handlerem obsłużymy tak jak pisałeś błędy z dołączaniem nieistniejących plików, ale nadal pozostają błędy których nie da się wychwycić.

Coby powrócić do tematu: błąd który był na naszej klasie zdecydowanie należy do błędów które da się wychwycić :-)

konto usunięte

Temat: Nasza klasa dalej daje ciała

Trochę poszukałem i można łapać takie błędy na poziomie serwera, patrząc co wypisuje i zmieniać response, pewnie Administratorzy z prawdziwego zdarzenia potrafią takie rzeczy zrobić...

konto usunięte

Temat: Nasza klasa dalej daje ciała

Jeszcze można zarejestrować funkcję wykonującą się po zakończeniu skryptu ( register_shutdown... ), która np przekierowuje na stronę o błędzie.
W każdym razie skoro w ciągu 20 min można coś wymyślić to tak duży serwis internetowy gdyby chciał to by sobie z tym poradził ;_)
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Właśnie też o tej funkcji pomyślałem, ale nadal nie wyłapie ona błędów E_CORE, E_PARSE... itd.
Dodatkowo funkcja wywoła się za każdym razem, a nie tylko wtedy gdy mamy błąd ;-)

Rozwiązanie po stronie serwera, nie PHP, w tym wypadku byłoby stosowniejsze.. Ale to już jest lekka paranoja, gdy mamy błąd na poziomie E_ERROR, E_PARSE, E_CORE....to nie jest tak częsta sytuacja.
1. E_PARSE w ogóle nie powinien się zdarzać na produkcji, nie wysyłamy na produkcję nieprzetestowanych skryptów!
2. E_CORE_*. - na te błędy nie mamy wpływu od strony skryptu
3. E_COMPILE_* - tutaj podobnie jak w 2.

W przypadku tak niskopoziomowych błędów jak E_CORE, E_COMPILE spokojnie wystarczy pusta strona - na pewno w serwisie wielkości nasza-klasa obciążenie narzucane na serwer do kontrolowania tego typu błędów (mod_proxy w apache?) nie pozostanie bez wpływu na ilość obsługiwanych requestów :-)

konto usunięte

Temat: Nasza klasa dalej daje ciała

Przeparsowanie odpowiednim wyrazeniem regularnym w C myślę że nie jest jakiś zasobożerne, co do shutdowna to sprawa jest prosta wystarczy że na końcu skryptu wstawisz zmienna która będzie checkpointem i wtedy możesz sprawdzić czy skrypt zakończył normalnie wykonywanie
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Ale co złapie Ci funkcja w shutdown czego nie złapie error_handler?

Co do zasobożerności parsowania czegokolwiek - tutaj pytanie skąd bierzemy dane wejściowe? Dostarcza serwer - jak? Buforuje wszystkie strony dla użytkownika i przesyła je do parsera, jeśli parser zatwierdzi, to OK - wysyłamy, jeśli nie to wyświetlamy stronę z błędem? Jak Ty to widzisz?

konto usunięte

Temat: Nasza klasa dalej daje ciała

Shutdown złapie wszystko ;_) Bo jest wywoływany zawsze po zakończeniu skryptu ( nawet po E_ERROR )

Serwer i tak przygotowuje dokument html zanim go prześle do klienta, kwestia sprawdzenia w locie co w nim jest.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Michał Wujas:
Shutdown złapie wszystko ;_) Bo jest wywoływany zawsze po zakończeniu skryptu ( nawet po E_ERROR )
>

No właśnie o to chodzi że nie... Nie wiem jak wygenerować E_ERROR, ale E_PARSE nie zostanie złapany przez shutdown! Domyślam się że podobnie będzie z E_CORE i E_COMPILE. Te błędy nie mogą być złapane przez skrypt, bo skrypt w ogóle się nie uruchomi - błędy są na nieco innym poziomie. Dlatego nie mogą zostać złapane przez error_handler i dlatego też nie zadziała shutdown().

Podsumowując jeśli już uruchomi się skrypt to error_handler złapie te same błędy które złapałby shutdown z tą różnicą że shutdown uruchomi się zawsze, a error_handler tylko gdy jest błąd.

Popraw moje rozumowanie jeśli się mylę :-)
Serwer i tak przygotowuje dokument html zanim go prześle do klienta, kwestia sprawdzenia w locie co w nim jest.

No to tutaj już wchodzimy do modyfikacji źródeł serwera. Jeśli nie chcemy tego robić pozostaje nam dorzucenie jakiejś nakładki która przechwyci wyjście serwera, a więc jakby nie patrzeć kolejna warstwa pomiędzy serwerem a użytkownikiem.

konto usunięte

Temat: Nasza klasa dalej daje ciała

Pomysł z register_shutdown_function bardzo dobry. Weźmy taki skrypt:

<?php

function myShutdownFunction() {
defined('NO_ERRORS') or die('Ups! Coś poszło nie tak...');
}

error_reporting(0);
register_shutdown_function('myShutdownFunction');

class DummyClass {}
$obj = new DummyClass();
$obj->noSuchMethod(); // fatal error

define('NO_ERRORS', TRUE);

Na samym końcu definiujemy stałą, która oznacza tyle, że udało się przejść cały skrypt bez błędów. To załatwia nam obsługę błędów typu E_ERROR, a to już dużo. Do tego set_error_handler i można by napisać całkiem niezły mechanizm do wyłapywania błędów.

konto usunięte

Temat: Nasza klasa dalej daje ciała

Maciej Włodarkiewicz:
kiedyś próbowałem zaakceptować zaproszenie i .... przy etykiecie "zaakceptowane" był dyskretny var_dump ;D. Aby było zabawniej osoba nie została dodana do moich przyjaciół oraz zaproszenie oczywiście wygasło :P

No tak, ale oni istnieja ile, dwa lata? Bledy dziecinstwa ;))

Gadu-Gadu istnieje znacznie dluzej, a programisci nadal nie odkryli, ze w swiecie standardem od dawna jest UTF-8. W systemach Windows w wersjach innych niz polska macie panie kolego krzaczory na ekranie zamiast ogonkow.

Coz, nikt nie jest idealny, ale niektorzy ucza sie na bledach :-P
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Łukasz S.:
No tak, ale oni istnieja ile, dwa lata? Bledy dziecinstwa ;))

Gadu-Gadu istnieje znacznie dluzej, a programisci nadal nie odkryli, ze w swiecie standardem od dawna jest UTF-8. W systemach Windows w wersjach innych niz polska macie panie kolego krzaczory na ekranie zamiast ogonkow.

Coz, nikt nie jest idealny, ale niektorzy ucza sie na bledach :-P

Może i UTF tam nie ma, ale używałem gg na linuksie i macu - żadnych krzaczorów nigdy nie widziałem :-)
Może to wina klienta gg? Inna sprawa że mogliby 1) wywalić z regulaminu zapis że korzystanie z innych klientów jest nielegalne albo 2) napisać klienta na maca i linuksa.

konto usunięte

Temat: Nasza klasa dalej daje ciała

Onet ma latin2, tabelki i różne takie dalej ;-)

Co do gg na linuksie to nie z takimi pierdołami sobie linuksiarze radzili, konwertowanie znaków to nie jest jakaś wielka sztuka.

Widzę że nie tylko ja wstaję tak wcześnie :PMichał Wujas edytował(a) ten post dnia 15.04.08 o godzinie 07:22
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Nasza klasa dalej daje ciała

Michał Wujas:
Widzę że nie tylko ja wstaję tak wcześnie :P[/edited]

Zdecydowanie wolę o tej godzinie kłaść się spać niż wstawać :p

Następna dyskusja:

logowanie - daje dostęp do...




Wyślij zaproszenie do