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.)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top