2011-11-15 22 views
7

Questo è un po 'di un colpo lungo, ma ho pensato di chiedere in ogni caso. Ho un'applicazione che ha la modifica del codice web-based, come la trovi su Github, usando l'editor ACE. Il problema è che è possibile modificare il codice che si trova all'interno dell'applicazione stessa.test di PHP per errore fatale

Sono riuscito a rilevare errori di analisi prima di salvare il file, il che funziona benissimo, ma se l'utente crea un errore di runtime, come ad esempio MyClass extends NonExistentClass, il file passa il controllo di analisi, ma salva sul filesystem, uccidendo l'applicazione.

Esiste un modo per verificare se il nuovo codice causerà un errore di esecuzione prima che salvare il file system? Sembra completamente contro-intuitivo, ma ho pensato che avrei chiesto.

+0

Wow. Questa è una delle migliori domande che ho visto in questo sito per un po '. Non vedo l'ora di rispondere a me stesso. Forse qualcosa con 'eval()' vale la pena controllare. –

risposta

2

Possibilmente utilizzare register_shutdown_function per costruire un oggetto JSON informazioni contenente circa l'errore fatale. Quindi utilizzare una chiamata AJAX per testare il file; analizzare il valore restituito dalla chiamata per vedere se c'è un errore. (Ovviamente si può anche eseguire il file PHP e analizzare l'oggetto JSON senza l'utilizzo di AJAX, basta pensare a quello che sarebbe il migliore dal punto di vista UX)

function my_shutdown() { 
    $error = error_get_last(); 
    if($error['type'] == 1) { 
     echo json_encode($error); 
    } 
} 
register_shutdown_function('my_shutdown'); 

emetterà qualcosa come

{"type":1,"message":"Fatal error message","line":1} 

Anteponi che all'inizio del file di test, quindi:

$.post('/test.php', function(data) { 
    var json = $.parseJSON(data); 
    if(json.type == 1) { 
     // Don't allow test file to save? 
    } 
}); 
+0

Love it. Grazie. – UncleCheese

+0

Non testato quindi non garantisce che funzioni ... Vorrei lasciare aperta la domanda per un po 'per vedere quali idee potrebbero avere gli altri. – andrewtweber

0

forse l'esecuzione del codice in un file separato prima e fissare un codice fisso sul fondo per verificare se si valuta?

2

Possibilmente utile: php -f <file> restituirà un codice di uscita diverso da zero se c'è un errore di runtime.

Problemi correlati