Alternativa a sistema ( 'php -l')?
-
27-09-2019 - |
Domanda
In un progetto a cui sto attualmente lavorando per, stiamo pensando di mettere system()
disable_functions
dichiarazione di php.ini. Ora, una meta-modulo di nostra che in ultima analisi anche cadere vittima di questa limitazione è sintassi di controllo dei file con chiamate system("php -l");
-. Mi spinge a caccia di alternative
Si scopre che ci era un php_check_syntax()
, ma non solo non ha fatto che limitarsi al solo controllo della sintassi ed ha continuato a includere il file se fosse sintatticamente valido, ma è stato rimosso come di PHP 5.0.5. Il manuale suggerisce php -l
al suo posto, ma dato che sono sicuro disabilitando le funzioni di chiamata del sistema in PHP è una pratica abbastanza comune, mi chiedo se c'è una, 'migliore' modo accettato di controllo della sintassi file PHP all'interno di file PHP .
(io non sono decisa a questo, tra l'altro,. Un 'no' basta perfettamente (e mi aspetto che, in realtà) Noi possono excempt il modulo da questa restrizione - ma sto chiedendo a questa domanda sia per curiosità, così come nella speranza di una soluzione più aggraziato.)
Soluzione
Ho trovato un'alternativa utilizzando PECL runkit_lint_file () .
Si fa lo stesso controllo di php_check_syntax ().
Credo che la pena dare un'occhiata.
Altri suggerimenti
Questo può essere anche un'opzione: Quando (se mai) è eval NON male?
E sembra più veloce:
$nTestTiempo0 = microtime(true);
exec('php -l yourfile.php',$arrMsgError,$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with exec : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with exec : 0.033198118209839 secs.
$nTestTiempo0 = microtime(true);
ob_start ();
var_dump(eval('return true; if(0){?>'.file_get_contents('yourfile.php').'<?php };'));
$arrMsgError = explode("\n",trim(ob_get_contents()));
ob_end_clean();
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with eval : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with eval : 0.00030803680419922 secs.
$nTestTiempo0 = microtime(true);
@system('php -l yourfile.php',$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with system : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with system : 0.032964944839478 secs.
Vedere il nostro PHP Formatter . Questo strumento da riga di comando prende un file PHP ben formato e formati piacevolmente.
Non solo formato, anche controlli di sintassi, e comando restituisce lo stato della linea che indica se il file è stato "ben formato"; esso contiene una completa PHP 5 parser. Poiché si tratta di uno strumento a riga di comando sarebbe facile lanciare da uno script PHP, se è quello che devi fare, e controllando lo stato restituito si sa se il file era legale.