2009-12-22 11 views
14

Mentre eseguo del codice PHP sul mio PC WAMP privato, sto ricevendo improvvisamente una risposta vuota dal server - nessuna risposta in effetti. Nessuna intestazione, nessun dato, niente nei log degli errori di PHP, nada. Ho riavviato APACHE e PHP ma ancora niente. So che PHP sta lavorando perché posso accedere ad altri script PHP bene.PHP produce una pagina completamente bianca, senza errori, registri o intestazioni.

Firebug non riporta intestazioni,? byte, e ci vuole solo 163 ms per "caricare" (quindi non è un timeout). Ho pensato al rapido consumo di memoria, ma ho monitorato la memoria del mio PC e non mostrava alcun picco. Errori ed eccezioni hanno funzionato fino ad ora.

Cosa diavolo?

max_execution_time = 30 ; 
max_input_time = 60 ; 
max_input_nesting_level = 64 ; 
memory_limit = 500M ; 

error_reporting = E_ALL | E_NOTICE | E_STRICT 
display_errors = On 
log_errors = On 

: EDIT:

Non toccherei @ con un dieci-piede-palo. Penso che i ruby ​​ragazzi lo buttino lì così i programmatori abbandonerebbero PHP.

Ad ogni modo, ho abilitato xdebug e non ha prodotto alcun file di grind. Poi ho preso il consiglio di zombat e posto un DIE() nella parte superiore della pagina e ha funzionato. Immagino di avere solo un po 'strano codice che uccide totalmente PHP . Anche se gli errori sono stati disabilitati o eliminati con @, dovrei comunque recuperare un'intestazione dal server con il contenuto vuoto!

Se trovo di più, lo posterò.

+0

Dove sta registrando errori? Forse sta entrando in un file o in stderr? –

+1

Cosa succede se chiami una risorsa non PHP? Funziona? Puoi provare un phpinfo() per verificare se stai usando il php.ini giusto? –

+1

Pubblica il codice PHP che non sta emettendo nulla. – Asaph

risposta

1

Ho indovinato la risposta a questo problema - si scopre che PHP 5.2.5 non può gestire una morte ricorsiva.

<?php 

class A 
{ 
    public function __construct() 
    { 
     new B; 
    } 
} 

class B 
{ 
    public function __construct() 
    { 
     new A; 
    } 
} 

new A; 

print 'Loaded Class A'; 

No intestazioni, gli errori, i contenuti, i registri, discariche Xdebug, i picchi di memoria, picchi di CPU, server si blocca, o niente. Dopo circa 150ms di PHP solo "finisce". Strano.

+0

È stato risolto in PHP 5.3.0 'Errore irreversibile: raggiunto il livello massimo di nidificazione delle funzioni di" 100 ", interruzione!' – Xeoncross

+2

Se si dispone della risposta, è necessario contrassegnare questo problema come risolto in modo che gli altri non perdano il loro tempo cercando di aiutarti. – SamGoody

+1

Non posso, StackOverflow mi fa aspettare accettarlo. Tra altre dieci ore sarò in grado di chiuderlo. – Xeoncross

-2

hai controllato i tuoi file per la chiusura dei tag ?>? O ancora più importante qualsiasi spazio bianco dopo di loro ...

6

Si potrebbe avere un file .htaccess in questa directory che ha modificato la segnalazione degli errori.

Per provare, provare a impostare in modo esplicito queste opzioni nella parte superiore dello script php che ti dà problemi.

ini_set('display_errors',1); 
error_reporting(E_ALL); 

Ho anche visto questo causato da pacchetti anti-virus troppo zelanti. Alcuni contengono software proxy web per filtrare internet ed e-mail. In quel caso, la pagina continuerebbe a caricare all'infinito ma non a completare mai.

0

controllare il registro eventi.

1

Controlla php.ini impostazione per short_open_tag = On o short_open_tag = Off

+0

Se i tag aperti corti erano disattivati, php verrebbe fuoriuscito nella pagina di rendering. La pagina non sarebbe vuota. –

1

La cosa più probabile è che qui apache si blocca. Esamina il registro degli errori di Apache, oppure collega un debugger.

Dettagli sulla guardando il debug del processo di apache/php per Windows possono essere trovati a http://bugs.php.net/bugs-generating-backtrace-win32.php

+0

+1 anche se in caso di incidente troverà un record nel registro eventi. molto più facile che litigare con un debugger. –

+0

Non è affatto un utente di Windows, non sapeva che Log Eventi ha mostrato queste cose :) Grazie però. –

6

Attenzione l'operatore @ (soppressione errore), se si dispone di un errore di sintassi su una linea con @ PHP silenziosamente uscita.

Per rilevare questa condizione, utilizzare set_error_handler e scrivere il proprio gestore degli errori, ci si può comunque vieni chiamato per errori in cui viene utilizzato @.

+1

+1: l'operatore di soppressione degli errori è un nemico personale. – zombat

+0

Esiste un'estensione pecl che può essere utilizzata per aiutare questo particolare problema. È un urlo dal nome appropriato: http://pecl.php.net/scream –

+0

Quando si utilizza @include (_once) 'file'; Non solo non segnalerà il fallimento dell'inclusione ma sopprimerà anche gli errori generati da quel file. –

8

Esegui la pagina da una console e riceverai il messaggio di errore.

// nix 
php yourFile.php 

// Windows 
c:\path\to\php.exe yourFile.php 
6

Tu dici altri script PHP stanno lavorando, in modo che indica probabilmente non è un problema di Apache. Sembra anche che tutte le impostazioni di registrazione siano corrette e che non venga registrato nulla, quindi è possibile che PHP esca normalmente prima di generare qualsiasi cosa. Uno dei seguenti potrebbe essere vero:

  • Una dichiarazione errata exit()? Stavi lavorando al codice, forse hai aggiunto un veloce exit() per controllare qualcosa e hai dimenticato di rimuoverlo?
  • L'idea di don.neufeld di controllare l'utilizzo dell'operatore @, che sopprime eventuali messaggi di errore, mi ha costato ore di tempo di debug nel passato. Sicuramente qualcosa da cercare.

In situazioni come questa, l'approccio di debug del povero uomo può produrre risultati rapidi. Lanciare un exit('wtf'); come prima riga nello script in questione qui. Funziona? I risultati di questo test escludono immediatamente ogni genere di possibilità, indipendentemente dal risultato. Se non si ottiene alcun output, è probabile che si tratti di un problema a livello di server (configurazione, modulo errato, ecc.), Sebbene si faccia attenzione a qualsiasi buffering di livello superiore. Se si ottiene l'output, allora si sa che il server funziona correttamente e il problema si trova più in profondità nello script, nel qual caso è possibile spostare la chiamata exit() su alcune righe, risciacquare e ripetere. Non è un modo elegante per eseguire il debug, ma è veloce e sporco e probabilmente troverai il problema tra un paio di minuti.

+4

+1 frase di uscita impressionante – Xeoncross

0

Quando ciò accade, in genere vale la pena ritagliare il più possibile il codice e vedere se è possibile ottenere qualcosa nella pagina da mostrare.

Potrebbe essere dovuto a una citazione non chiusa da qualche parte nel codice o una parentesi non chiusa. Ciò potrebbe causare l'istruzione echo per essere visto come testo o in un'altra funzione, ecc

E, mentre tutti gli errori devono essere segnalati, ho scoperto che non tutti gli errori sono in realtà segnalati, probabilmente a causa delle impostazioni ini su un host condiviso che è fuori dalla mia portata.

Commentare non è sempre sufficiente, non è sicuro perché no. Quando succede questo, di solito trovo più veloce copiare la pagina, e lentamente ritagliare e incollare le sezioni fino a trovare l'errore, dopo di che posso calciare me stesso per un errore di battitura.

+0

Vero, ma anche errori di battitura danno luogo a qualche forma di errore. – Xeoncross

1

Per attivare la visualizzazione di errore nel codice PHP nel caso in cui non si vede nulla, inserire

ini_set('display_errors',1); 
error_reporting(E_ALL); 

Esempio in cui questo potentialy consente di risparmiare un sacco di tempo:

Questo codice in un default joomla .php file di modello visualizza una pagina vuota senza msg di errore senza linee 20 e 21

17 <?php if ($params->get('title_article_linkable')) { ?> 
18  <a href="<?php 
19   $url = JRoute::_(ContentHelperRoute::getArticleRoute($item->id,$item->catid)); 
20   ini_set('display_errors',1); 
21   error_reporting(E_ALL); 
22   echo $url; ?>"> 
23  <?php echo $this->item->title; ?></a> // should be $item->title !! 
24 <?phpLL000000 } else { ?> 
25  <?php echo $item->title; ?> 
26 <?php } ?> 

uscita:

enter image description here

Problemi correlati