PHP visar inte "Warning" och "Notice"

Tråden skapades och har fått 10 svar. Det senaste inlägget skrevs .
1

Jag installerade nyligen OS X Server (10.8) på min Mac Mini och vill kunna koda PHP på den. Allt fungerar bra förutom att den vägrar visa mig "Warning" och "Notice" i webbläsaren trots att min php.ini ser ut enligt följande:

error_reporting = E_ALL | E_STRICT

display_errors = On

Det är rätt php.ini som jag har ändrat i (stämt av mot phpinfo()). Jag har även sökt igenom php.ini-filen efter dubletter av error_reporting och display_errors utan resultat. Har version 5.3.13 av PHP som följer med OS X Server idag vilket gör att E_STRICT inte ingår i E_ALL (finns först i PHP 5.4.0) och därför jag har lagt till det.

"Warning" och "Notice" dyker upp i loggfilerna men jag vill ha de i webbläsaren när jag utvecklar, det är smidigare tycker jag.

phpinfo() visar följande:

display_errors

On

error_reporting

32767

error_reporting ger värdet 32767 som motsvarar E_ALL, men borde det inte ge 34815 (32767+2048) som motsvarar E_ALL + E_STRICT? Se http://www.php.net/manual/en/errorfunc.constants.php

Någon som har minsta lilla tanke på vad jag kan testa eller kan ha missat? Jag är öppen för alla förslag just nu!

Ingen som har någon liten tanke eller idé?

32767 är rätt, E_ALL inkluderar E_STRICT sedan 5.4.0. Är du säker på att koden du använder genererar varningar och att inget tidigare i scriptet har ändrat på felrapporteringen eller ersatt den vanliga rapporteringsmetoden via set_error_handler()? Hur ser din testkod ut?

Observera att jag inte har 5.4 utan en tidigare version som inte inkluderar E_STRICT.
Det finns ingen kod som påverkar felrapporteringen, jag förlitar mig helt på serverns konfiguration.

Jag har ett script som raderar bilder i en mapp och om det inte finns någon fil så blir det ju en varning. Koden ser ut enligt följande:

$info = mysql_fetch_assoc(mysql_query('SELECT bild1,filnamn FROM poster WHERE id='.$id.' LIMIT 1'));
$bildTyp = substr($info['bild1'],-4,4);
for ($b=1;$b<=5;$b++) {
    unlink('postbilder/'.$id.'.'.$b.'_mini'.$bildTyp);
    unlink('postbilder/'.$id.'.'.$b.'_liten'.$bildTyp);
    unlink('postbilder/'.$id.'.'.$b.'_mellan'.$bildTyp);
    unlink('postbilder/'.$id.'.'.$b.'_stor'.$bildTyp);
}

I webbläsaren får jag inga felmeddelanden alls ifall filen i fråga saknas, men i error_log hittar jag följande:

[Wed Aug 29="29" 08:38:52 2012="2012"] [error] [client ip] PHP Warning:  unlink(nyhetsbilder/20.1_mini0): No such file or directory in /Volumes/Torgny/Library/Server/Web/Data/Sites/www.exempel.com/armar/redigera_nyhet.php on line 11, referer: http://www.exempel.com/armar/index.php
[Wed Aug 29="29" 08:38:52 2012="2012"] [error] [client ip] PHP Warning:  unlink(nyhetsbilder/20.1_liten0): No such file or directory in /Volumes/Torgny/Library/Server/Web/Data/Sites/www.exempel.com/armar/redigera_nyhet.php on line 12, referer: http://www.exempel.com/armar/index.php
[Wed Aug 29="29" 08:38:52 2012="2012"] [error] [client ip] PHP Warning:  unlink(nyhetsbilder/20.1_mellan0): No such file or directory in /Volumes/Torgny/Library/Server/Web/Data/Sites/www.exempel.com/armar/redigera_nyhet.php on line 13, referer: http://www.exempel.com/armar/index.php
[Wed Aug 29="29" 08:38:52 2012="2012"] [error] [client ip] PHP Warning:  unlink(nyhetsbilder/20.1_stor0): No such file or directory in /Volumes/Torgny/Library/Server/Web/Data/Sites/www.exempel.com/armar/redigera_nyhet.php on line 14, referer: http://www.exempel.com/armar/index.php


...

Däremot ger följande kod felmeddelande i webbläsaren:

<?php
echo $hej;
?>

I webbläsaren:

Notice: Undefined variable: hej in /Volumes/Torgny/Library/Server/Web/Data/Sites/www.exempel.com/error.php on line 2

Den enda skillnaden mellan dessa är ju att den första är Warning och den andra Notice, men de borde ju synas båda två i webbläsaren.

Ah, missade det stycket. 32767 är dock fortfarande rätt, E_ALL var 30719 i 5.3 (det framgår i din länk vilka värden den konstanten har haft tidigare). Jag antar att ditt första script inte skriver ut några notiser heller? Det saknas ju vissa delar av scriptet, men det är alltså inget som rör error_reporting(), set_error_handler(), eller ini_set() i de styckena? Har du output buffering igång, skriver du ut den när scriptet avslutas isf?

Ursprungligen av Luftvargen:

Ah, missade det stycket. 32767 är dock fortfarande rätt, E_ALL var 30719 i 5.3 (det framgår i din länk vilka värden den konstanten har haft tidigare). Jag antar att ditt första script inte skriver ut några notiser heller? Det saknas ju vissa delar av scriptet, men det är alltså inget som rör error_reporting(), set_error_handler(), eller ini_set() i de styckena? Har du output buffering igång, skriver du ut den när scriptet avslutas isf?

Det finns inget i koden som berör error_reporting(), set_error_handler() eller ini_set(). Output_buffering är satt till 4096 i php.ini, provade att bara köra On som värde utan att det blev någon förändring.
Skriptet avslutas med att skriva till databasen och sedan kommer header('Location: url'); och sen är det slut.

Det verkar som att felmeddelanden från php endast skrivs ut om det finns en echo/print med i bilden eftersom echo $hej; (om $hej inte är satt) genererar ett felmeddelande i webbläsaren men unlink() ger endast felmeddelande i loggen. Kan det vara något som hjälper oss?

Dessvärre inte, om display errors är igång så ska det skrivas ut ändå. Se exempel här:
http://codepad.viper-7.com/LFq27j

Det är väl inte så att du inte ser meddelandena eftersom att din Location-header redirectar browsern? Kommentera bort den raden om du har testat med det igång.

Ursprungligen av Luftvargen:

Det är väl inte så att du inte ser meddelandena eftersom att din Location-header redirectar browsern? Kommentera bort den raden om du har testat med det igång.

Du har rätt. Tack! Jag är van vid att header() genererar error, warning eller liknande om det har blivit output innan header() kommer, men tydligen inte nu. Vet du om det går att ställa in för det är ju trevligt att få alla felmeddelanden under utvecklingen?

I en HTTP-request måste alla headers komma före innehållet, därför får du en varning om du redan har skickat innehåll till klienten. När du har automatisk output buffering aktiverad kan du skriva ut innehåll tills buffern är full innan något skickas, och i det glappet kan du då skicka headers ändå. Du bör dock inte förlita dig på den automatiska bufferns storlek, det är väldigt svårt att få konsekventa resultat på det sättet, och det är därför detta har verkat fungera tidigare men inte nu. Använd ob_start() m.m. manuellt istället, eller abstrahera bort det till objekt som kan hjälpa dig att bygga svaren.

HTTP/1.1 200 OK
Content-Length: 1234
Content-Type: text/html; charset=UTF-8

<!DOCTYPE HTML>
<html>
...

Först headers, sedan innehåll.

Du kan få fel att hanteras annorlunda via set_error_handler(); en metod är att göra om dom till exceptions istället som då måste hanteras av dig för att programmet ska kunna fortsätta. I det här fallet hade det dock räckt med att kontrollera att filen finns och att du har rätt att radera den.

Nu är jag med i matchen känner jag. Tack så mycket för hjälpen!

1
Bevaka tråden