Schermo bianco della morte – nessun errore mostrato in ambiente PHP / Vagrant (Yii)

Non posso essere sicuro che questo problema sia in parte dovuto al vagabondo, tuttavia ho un'installazione di Yii 1.x all'interno di una scatola di Vagrant che esegue Unix.

Sto cercando di forzare un semplice errore PHP come un punto e virgola mancante in un controller, anche se sono sicuro al 100% di aver creato un errore Non vedo la pagina di errore Yii standard con la traccia dello stack. Questo ha funzionato in precedenza anche se sembrerebbe che qualcosa di recente abbia smesso di funzionare in questo modo.

La cosa strana è che Yii sta emettendo le query del Database nella parte inferiore dello script (questo è inteso ma non riesco a capire perché Yii stia mostrando solo le query DB.

La mia configuration personale è la seguente: (mostra solo parte di esso ..)

Ho provato il codice qui sotto e controllare i registri ma nessuna gioia

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

Qualcuno può suggerire qualche idea …

 return arrays( 'yiiDebug' => true, 'yiiTraceLevel' => 6, ..... 'components'=>arrays( 'log' => arrays( 'class' => 'CLogRouter', 'routes' => arrays( 'web' => arrays( 'class' => 'CWebLogRoute', 'levels' => 'profile, trace, info, error, warning, application', // profile, trace, info, error, warning, application 'showInFireBug' => false ), 'file' => arrays( 'class' => 'CFileLogRoute', 'levels' => 'error, warning, watch', // error, warning, watch 'categories' => 'system.*', ), arrays( 'class' => 'CProfileLogRoute', 'levels' => 'error, warning, trace, info, profile', // error, warning, trace, info, profile ), ), ), ), 

Ad esempio, in uno dei miei controller ho il seguente codice:

 public function actionDelete($id) { $model = $this->loadModel($id); 5e55 // added error here on purpose } 

Mi aspetterei un errore sulla seconda row per quanto riguarda il 5e55 che non ha spazio, tuttavia, piuttosto che ricevere un errore, tutto quello che vedo è uno schermo bianco (più il registro dell'applicazione Yii che mostra tutte le query ecc.) rimuovere la roba di configuration yii per le query di output ottengo uno schermo bianco / vuoto al 100%.

Ho provato ad aggiungere varie cose al file bootstrap index.php, ma senza alcuna gioia, la mia configuration sembra relativamente normale, ma non riesco a capire perché l'errore viene segnalato al browser o ai miei registri.

Hai fatto la cosa giusta impostando

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

… ma ci sono alcuni motivi per cui questo potrebbe non avere effettivamente effetto.

1) La segnalazione degli errori potrebbe essere di nuovo distriggersta da qualcosa di "successivo" nella sceneggiatura. Poiché queste impostazioni sono fondamentalmente solo variables globali, chiunque può impostarle e la maggior parte dei framework ha una posizione disabilitata. A seconda di where il codice è stato "incluso", qualcos'altro nella catena potrebbe aver chiamato display_errors – false.

2) La modifica delle impostazioni può essere disabilitata in fase di esecuzione. Il tuo ambiente potrebbe avere qualcosa come le direttive php_admin_flag per fermare la visualizzazione di display_errors.

Se riesci a get l'output, prova a eseguirlo per scaricare lo stato di tutte le impostazioni ini:

 var_dump(ini_get_all()); 

MA quello che penso stia probabilmente succedendo è che hai un piccolo errore di syntax in uno dei tuoi file e l'interpnetworking rinuncerà completamente a quel codice. Non viene mai eseguito, quindi l'impostazione display_errors non viene nemless avviata.

Come altri hanno suggerito, uno sguardo ai log degli errori probabilmente ti dirà cosa sta succedendo.

Un altro modo hacky ma utile è quello di provare ed eseguire i file sulla row di command e vedere se fornisce un avviso di syntax. Non ho familiarità con Yii ma trovo i file che hai modificato di recente ed esegui questo:

 php -f yourproject/somefile_ofyours.php 

Probabilmente sputerà un errore come questo:

 PHP Parse error: syntax error, unexpected 'xxxxx' (T_STRING) in somefile_ofyours.php on line 27 

Hai un file di registro degli errori php impostato in php.ini? Contiene qualcosa? Hai provato a forzare la modalità di debug di yii tramite php?

  define( 'YII_DEBUG', true ); 

altre idee top-of-the-head:

  • abilita l'output html di errori e avvisi
  • vedi in phpinfo che stai usando il php.ini corretto e che la segnalazione degli errori è indieed a cosa l'hai impostata.
  • controlla il log degli errori di apache
  • qual è il valore di $_SERVER['APPLICATION_ENV'] ?

Prima di tutto … puoi controllare le regole, che l'utente corrente è autorizzato a visualizzare la pagina degli errori

 public function accessRules() { return arrays(arrays('allow', 'actions' => arrays('index', 'view', 'error'), 'users' => arrays('@')), } 

E controlla anche.

 public function actionError() { if($error=Yii::app()->errorHandler->error) { if(Yii::app()->request->isAjaxRequest) echo $error['message']; else $this->render('error', $error); } } 

Quando un errore viene inoltrato al componente dell'applicazione CErrorHandler, sceglie una vista appropriata per visualizzare l'errore. Questo link potrebbe aiutare

 protected function resolveErrorMessage($rule) { if($rule->message!==null) return $rule->message; elseif($this->message!==null) return $this->message; else return Yii::t('yii','You are not authorized to perform this action.'); } 
  • Risolve il messaggio di errore da visualizzare.
  • Questo metodo controllerà {@link message} e {@link CAccessRule :: message} per vedere
  • quale messaggio di errore dovrebbe essere visualizzato.
  • @param CAccessRule $ regola la regola di accesso
  • @return string il messaggio di errore

Fonte: collegamento

Controlla qui i tuoi file di registro degli errori e pubblica errori. Può aiutare a risolvere i tuoi problemi.

Assicurati anche di avere le seguenti impostazioni in PHP.ini

 ; Report All Errors error_reporting = E_ALL ; Display Errors display_errors = On 

Anche la logging di un gestore di shutdown può essere di grande beneficio in queste situazioni.

vedere

http://php.net/manual/en/function.register-shutdown-function.php

per ulteriori dettagli,

By the by puoi fare qualcosa di selvaggio con un buon gestore di chiusura 🙂