2011-08-22 19 views
40

Mam problem, gdy mam aplikację php, która zwraca wewnętrzny błąd serwera (500), ale nic nie pokazuje się w dzienniku błędów.php zwraca 500 błędów, ale brak rejestru błędów

Teraz wiem, że są błędy z tym, co próbuję uruchomić, wiem, że brakuje niektórych plików, a co nie, ale coś powinien pokazać w dzienniku błędów Apache (inaczej, jak mam wiedzieć dokładnie, co mi brakuje).

Utworzony skrypt testowy jest błędem w tej samej konfiguracji vhost i ten błąd pokazuje się dobrze, więc wszystko wydaje się być skonfigurowane z punktu widzenia php/apache. Czy są jakieś błędy php, które pojawiają się w dzienniku błędów (php jest skonfigurowany do wyświetlania dowolnego typu ogłoszenia, ostrzeżenia, błędu, krytycznego błędu, itp ...)?

Działa na Ubunut 10.04 standardowym apache i php z repozytorium ubuntu z apt-get.

+0

to jest z Windows i IIS, prawda? – Neal

+0

Przepraszam, powinienem załączyć: Ubuntu 10.04 – ryanzec

+0

Apache i PHP zarówno ze standardowego repozytorium ubuntu z apt-get – ryanzec

Odpowiedz

45

Zeskanuj swoje pliki źródłowe, aby znaleźć @.

From php documentation site

Obecnie „@” Błąd sterowania prefiks operatora nawet wyłączyć raportowanie błędów krytycznych błędów, które zakończy skryptu wykonanie. Między innymi oznacza to, że jeśli użyjesz "@" do pominiesz błędy z pewnej funkcji i albo nie będzie ona dostępna lub została błędnie wpisana, skrypt zginie, bez wskazania, dlaczego.

+18

To było to, CodeIgniter najwyraźniej uwielbia korzystać z nich w tym systemie, kreślić kolejny powód, dla którego nie lubię CodeIgniter.Te dokładnie to, w moim przypadku, – ryanzec

+6

. CodeIgniter 'return @mysql_connect (...' maskował fakt, że nie udało mi się zainstalować modułu mysql php na świeżym serwerze, głupi, stracone godziny, lekcja, której się nauczyłem – rymo

+0

Och, człowieku, mam nadzieję, że to jest to. Aplikacja CI także ... –

0

Musisz włączyć dziennik błędów PHP.

Jest to spowodowane przypadkową usterką serwera WWW, gdy wystąpił błąd php, powoduje błąd wewnętrzny 500 (mam ten sam problem).

Jeśli zajrzysz do protokołu błędów PHP, powinieneś znaleźć swoje rozwiązanie.

see here in the doc of how to enable it in the php.ini

+0

Myślę, że źle zrozumiałeś pytanie .. jego dziennik błędów PHP jest włączony, ale ten konkretny błąd 500 wewnętrzny serwera nie był zalogowany. Mam teraz ten problem w Laravel dla błędu generowanego przez próbę uzyskania dostępu do prywatnej metody. Inne 500 błędów jest rejestrowane, ale nie ... Nie można zrozumieć, dlaczego :( – geoidesic

6

Może coś wyłącza wyjście błędu. (Rozumiem, że próbujesz powiedzieć, że inne skrypty poprawnie wyprowadzają swoje błędy do rejestru błędów?)

Możesz rozpocząć debugowanie skryptu, określając, gdzie kończy się skrypt (zacznij od dodania echo 1; exit; do pierwszej linii skrypt i sprawdzenie, czy przeglądarka wyprowadza 1, a następnie przesuń tę linię w dół).

5

W przeszłości miałem żadnych dzienników błędów w dwóch przypadkach:

  1. Użytkownik w ramach którego został uruchomiony Apache nie miał uprawnień do modyfikowania php_error_log pliku.
  2. Błąd 500 wystąpił z powodu złej konfiguracji .htaccess, na przykład nieprawidłowych ustawień modułu przepisywania. W tej sytuacji błędy są rejestrowane w pliku Apache error_log.
2

Oto kolejny powód, dla którego błędy mogą nie być widoczne:

miałem ten sam problem. W moim przypadku skopiowałem źródło ze środowiska produkcyjnego.W związku z tym zmienna zdefiniowana w index.php została ustawiona na 'production'. To spowodowało, że error_reporting ustawiono na 0 (brak logowania). Wystarczy ustawić go na 'development' i powinieneś zacząć widzieć komunikaty o błędach w dzienniku Apache.

Okazało się, że 500 była spowodowana pół okrężnicy brakuje w konfiguracji bazy :-)

1

Kolejna sprawa, która mi się stało, to zrobiłem CURL do niektórych z moich stron i dostał wewnętrzny błąd serwera i nic znajdował się w dziennikach apache, nawet gdy włączono wszystkie raporty o błędach.

Moim problemem było to, że w CURL ustawić curl_setopt($CR, CURLOPT_FAILONERROR, true);

Które potem nie pokazał mi mój błąd, chociaż nie było jednego, to stało się dlatego, że błąd był na poziomie ramowej, a nie w jednym PHP, więc nie pojawił się w dziennikach.

2

przypadku projektów Symfony, należy sprawdzić pliki w aplikacji project'es/logs

Więcej szczegółów dostępnych na tym stanowisku:
How to debug 500 Error in Symfony 2

Btw, innych ram lub CMS podzielenia tego rodzaju zachowanie .

0

Upewnij się, że uprawnienia do pliku są poprawne. Jeśli apache nie ma uprawnień do odczytu pliku, to nie może zapisywać do dziennika.

+1

Apache powinien już mieć uprawnienia root'a niezależnie od systemu operacyjnego, dlatego powinien mieć możliwość zapisu do dowolnego pliku, nie mówiąc już o własnym pliku dziennika. –

+0

Żaden Apache nigdy nie powinien mieć uprawnienia root. Byłoby to poważne naruszenie bezpieczeństwa. –

1

Kopiuj i wklej następujący do nowego .htaccess pliku i umieścić go w folderze głównym witryny:

php_flag display_errors     on 
php_flag display_startup_errors   on 

Błędy będą wyświetlane bezpośrednio na stronie.

To najlepszy sposób szybkiego debugowania, ale nie używaj go przez długi czas, ponieważ może to być naruszenie bezpieczeństwa.

Powiązane problemy