4

私が現在取り組んでいるプロジェクトでは、system()php.ini のdisable_functions宣言に入れることを検討しています。現在、最終的にこの制限の犠牲になるメタモジュールの 1 つは、system("php -l");呼び出しを伴う構文チェック ファイルです。

以前php_check_syntax()は . マニュアルはphp -lその場所で提案していますが、PHPでシステムコール関数を無効にすることはかなり一般的な方法であると確信しているため、PHPファイル内からPHPファイルを構文チェックする受け入れられた「より良い」方法があるかどうか疑問に思っています.

(ちなみに、私はこれに夢中になっているわけではありません。「いいえ」で十分です(そして、私はそれを期待しています)。この制限からモジュールを除外することはできますが、好奇心からこの質問をしていますより優雅な解決策を期待して.)

4

3 に答える 3

3

PECL runkit_lint_file()を使用して代替手段を見つけました。

php_check_syntax() と同じチェックを行います。

一見の価値があると思います。

于 2010-10-05T08:34:36.040 に答える
2

これも選択肢の 1 つです: eval が悪ではないのはいつですか?

そして、より速く見える:

$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.
于 2011-05-10T16:56:43.297 に答える
0

PHP フォーマッターを参照してください。このコマンドライン ツールは、適切な形式の PHP ファイルを受け取り、適切にフォーマットします。

フォーマットするだけでなく、構文チェックも行い、ファイルが「整形式」であるかどうかを示すコマンドラインステータスを返します。完全な PHP 5 パーサーが含まれています。これはコマンド ライン ツールであるため、必要に応じて PHP スクリプトから簡単に起動できます。また、返されたステータスをチェックすることで、ファイルが合法であるかどうかを確認できます。

于 2010-10-06T15:40:30.900 に答える