質問

私が現在働いているプロジェクトでは、パッティングを検討しています system() php.ini'sに disable_functions 宣言。現在、最終的にこの制限の犠牲になる私たちのメタモジュールの1つは、構文チェックファイルです。 system("php -l"); 電話 - 私に代替案を探してもらうように促します。

以前はaがありました php_check_syntax(), 、しかし、それ自体が単に構文をチェックすることに制限しなかっただけでなく、構文的に有効である場合はファイルを含めるようにしましたが、PHP 5.0.5の時点で削除されています。マニュアルは提案しています php -l その代わりに、しかし、PHPでシステムコール機能を無効にすることはかなり一般的な慣行であると確信していることを考えると、PHPファイル内からPHPファイルをチェックする構文の「より良い」方法があるかどうか疑問に思っています。

(ちなみに私はこれについて地獄に曲がっていません。「いいえ」は完全に十分です(そして、私はそれを本当に期待しています)。 できる この制限からモジュールを除去してください - しかし、私はこの質問を好奇心からだけでなく、より優雅な解決策を期待しています。)

役に立ちましたか?

解決

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

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

見てみる価値があると思います。

他のヒント

これもオプションになります。(もしあれば)評価は悪ではないのですか?

より速いようです:

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

私たちを参照してください PHPフォーマッタ. 。このコマンドラインツールは、よく形成されたPHPファイルを使用し、適切にフォーマットします。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top