3

さまざまなコード品質の問題をチェックする監査機能をアプリケーションに構築しようとしています。

私がやりたいことの 1 つは、特定の PHP ファイルの構文エラーをチェックすることです。php_check_syntax()を使用する予定でしたが、PHP 5.0.5 で削除されました。

exec()ステートメントを使用してみましたが、何も出力されません。date動作していることを確認するために追加しましたexec()

<?php

error_reporting(E_ALL | E_NOTICE | E_STRICT | E_WARNING);
ini_set('display_errors', 1);

$output = 'before';
var_dump($output);
var_dump(exec('php -l ' . __FILE__, $output));
var_dump($output);
var_dump(exec('date', $output));
var_dump($output);

出力:

string 'before' (length=6)
string '' (length=0)
array (size=0)
  empty
string 'Thu Feb  6 10:42:35 PST 2014' (length=28)
array (size=1)
  0 => string 'Thu Feb  6 10:42:35 PST 2014' (length=28)

PHPの構文エラーについてPHPファイルをチェックするにはどうすればよいですか?

4

3 に答える 3

2

Web サーバーの構成を確認してください。次のような場所: disable_functions="". var_dump($output) が配列を返し始めた後、配列内のエラーをチェックして、php への正しいパスなどのさらなるエラーを排除します。

これを使用して、他の可能性を排除します。

$output="just before exec";
var_dump($output);
exec('php -l /path/to/file.php', $output);
var_dump($output);

ps は次のように使用できます

echo exec('php -l /path/to/file.php');

Upd: 更新された質問は、exec の動作を示しています。*nix のようなプラットフォームがエラー出力を隠している可能性があります。コマンド 2>&1 に追加するようにリダイレクトする方法は、エラー出力を標準出力にリダイレクトします

$to_run = '/path/to/bin/php -l /path/to/file 2>&1';
$output ="" ; //init
var_dump(exec($to_run, $output));

プラットフォームでルート アクセス権を持っている場合は、strace などのツールを使用して複雑なケースをデバッグすることもできます。

'/path/to/bin/strace -o/path/to/strace.log php -l /path/to/file.php'

UPD: var_dump(exec('php -l ' . FILE .' 2>&1', $output)); // UNIX プラットフォームのエラー リダイレクション

于 2014-02-06T11:33:52.933 に答える