Newsgroup: it.comp.www.php
Titolo: PHP muore silenziosamente

Ciao a tutti,
 
oggi tocca a me fare una domanda. :)
 
Sto sviluppando un progetto abbastanza complesso (nel senso che ha molte 
classi che interagiscono tra loro), e gli errori abbondano, dovendo 
magari creare e modificare 6-7 classi prima di poter testare il codice.
 
Mi capita molto spesso che PHP muoia senza dare segnali. Perfino lo 
status di apache e` 200 e non 500.
 
Ho gia` impostato l'impostabile nel php.ini:
 
error_reporting = E_ALL | E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On (ma anche Off)
report_zend_debug = On (ma anche Off)
 
Il mio dubbio e` che muoia durante la compilazione degli script, prima 
ancora di iniziare ad eseguirli, ma ho provato anche
 
find . -name "*.php" -exec php5 -l {} \;
 
e tutti gli script mi dicono "No syntax errors detected".
 
Ho una Debian testing con PHP 5.3.8-1 con Suhosin-patch (Zend engine 
2.3.0 con suhosin 0.9.32.1)
 
Prima che mi metta a ricompilare PHP cambiando flag di compilazione, 
qualcuno ha qualche suggerimento?
 
Grazie.
Bye.

 status di apache e` 200 e non 500.
 
In questo caso ho risolto, ma la domanda rimane, perche` e` seccante 
leggere a mano il codice cercando gli errori e immaginando cosa potrebbe 
andare storto.
 
Ho notato che l'uso di abstract e` abbastanza fragile.
 
In questo caso avevo tre classi:
 
abstract class Base {
 abstract public function f();
}
 
class Uno extends Base {}
 
class Due extends Uno {
 public function f() { print "pippo"; }
}
 
Semplicemente siccome Uno non implementa f(), PHP muore. Senza dare 
errori.
 
Faccio notare che Uno non viene mai istanziata da sola, ma viene 
istanziata sempre e solo Due (e le sue sorelle)
 
Basta implementare f(), anche vuota, in Uno, per risolvere il problema.
 
Ora vedo se ci sono ticket aperti a riguardo.
 
Bye.
 


A naso l'unico problema è il silenzio al crash, cosa che di solito fa 
infuriare anche me.
 
Di solito con il debugger però si risolvono questi problemi: breakpoint 
a raffica e vai
O moriva ancora alla compilazione?
 
-- 
I fatti mi cosano

 Ho notato che l'uso di abstract e` abbastanza fragile.
 
Altro aggiornamento, magari a qualcuno puo` servire. :)
 
Non e` PHP che muore senza dire niente, ma PHPUnit che sopprime l'errore, 
e non ho ancora capito perche` e come disabilitare questa cosa.
 
Richiamando phpunit con --process-isolation completa i test e 
(giustamente) fallisce, ma torna un desolante
 
There was 1 error:
 
1) DueTest::testF
RuntimeException: 
 
Si`, e` tutto quello che dice: niente errori, niente riga di codice, 
niente file "vero" in cui c'e` l'errore.
 
Continuo ad approfondire...
 
Bye.
 


Sembra un puntatore a NULL.
Puoi provare magari a tracciare il processo PHP con strace, o qualche 
altro debugger.

 errori.
 
A me da CLI lo dà
 
$ cat bar.php 
<?php
abstract class Base {
     abstract public function f();
}
 
class Uno extends Base {}
 
class Due extends Uno {
     public function f() { print "pippo"; }
}
?>
$ php -l bar.php 
 
Fatal error: Class Uno contains 1 abstract method and must therefore be 
declared abstract or implement the remaining methods (Base::f) in 
bar.php on line 7
Errors parsing bar.php
$

 errori.
 
A me invece in questo tuo esempio lo segnala correttamente
 
Fatal error: Class Uno contains 1 abstract method and must therefore be 
declared abstract or implement the remaining methods (Base::f) in 
pellizzari.php on line 6
 
 
Php 5.3.3
Apache 2.2.14
 
ciao
Mauro

 A me invece in questo tuo esempio lo segnala correttamente
 
Ho semplificato troppo. :)
 
Questo funziona anche a me. A questo punto mi sa che c'e` qualche 
problema con l'autoloader, perche` le classi sono in tre file diversi e 
vengono appunto caricate con l'autoloader.
 
Tra l'altro questo spiegherebbe perche` mi capita anche con ZendFramework 
(che usa un autoloader simile al mio) e con PHPUnit (a cui ho detto di 
usare il mio autoloader).
 
Piu` tardi faccio qualche test.
 
Bye.

 O moriva ancora alla compilazione?
 
Ho fatto un po' di test nel weekend. Il problema era nell'autoload, e in 
quello che penso sia un bug di include().
 
Io ho un autoloader:
 
public function autoload($class)
{
 $components = explode('_', $class);
 $classPath = implode('/', $components) . '.php';
 
 if (!@include_once($classPath)) {
  throw new Exception('Unable to find class ' .$class);
 }
}
 
Notare la @ che inibisce gli errori. Messa apposta perche` se torna 
errore lancia un'eccezione che posso intercettare.
 
Avendo le tre suddette classi in tre file separati, quando faccio 
 
$c = new Due();
 
lui fa l'include di Due.php e funziona, poi fa l'include di Uno.php e si 
blocca la compilazione (per l'abstract errato), ma include_once non 
ritorna errore, quindi non lancia nemmeno l'eccezione e blocca tutto.
 
Se tolgo la @ naturalmente funziona, ma mi mostra l'errore a video, e in 
produzione non voglio che lo faccia (per quello avevo messo 
l'eccezione). :/
 
Grazie a tutti, comunque, per i tentativi di soluzione. :)
 
Bye.


Eh, l'override dell'autoload ha fatto passare dei brutti quarti d'ora 
anche a me. Adesso mi appoggio a quello di Symfony quindi problema risolto
Una cosa come
if(DEV_ENVIRONMENT){
	if(!include ...
}else {
	if(!@include ...
 
dici che funzionerebbe?


 dici che funzionerebbe?
 
Si`, infatti e` quello che ho fatto :)
 
Bye.
 


Come dice il Phd. col quale intergisco di più in facoltà:
"Great minds think alike" :)
