2011-12-19 11 views
5

私はPHPプログラムを提供しています。しかし、このプログラムは、何人かの異なる人々によって長年にわたって行われてきました。物事は時間の経過とともに削除され、追加されました。しかし、ほとんどのファイルはまだそこにあります。PHPプログラムの分析

私はそこにPHPプログラムを分析できるツールがあるのだろうと思っていました。例えばindex.phpにフィードしてください。このツールは魔法使いのファイルが呼び出されて使用されるのを確認して見て、使用されなくなった全ての死んだ木材を取り除くことができます。

私はそれを自分で書くことを計画していましたが、他の誰かがすでにこのようなことをしている可能性があります。

どんな提案も歓迎します、Thx! Mike

+1

PHPは 'include $ _GET ['file']'を書くことができるので、このような分析には適していません。このようなことをする必要はありませんが、ファイルが含まれている可能性のあるすべてのケースをカバーすることは不可能*であることを意味します。 – deceze

+2

このパスは偽陽性で熟しています。ファイル名の相互参照を探しているソースアナライザーで概要を得ることができます。ダイナミックなものを確実にキャプチャすることは非常に困難です。ただし、実際にインクルードされているファイルを確実に判断するには、http://pecl.php.net/package/incluedを使用することができます。そして、[PHP Depend and others](http://stackoverflow.com/questions/4156157/tool-for-php-code-analysis)がより役立つリストを提供するかもしれません。 – mario

答えて

1

xdebugを使用し、基本的にアプリケーションをデバッグするためのオプションがいくつかあります。使用中のファイルが見つかるまで、あなたはステップしています。

もうひとつはbrute forceです:)ファイルを1つずつ削除して、アプリケーションが壊れているかどうかを確認してください。テストする部分がたくさんある場合、これには時間がかかることがあります。

あなたがアプリを探している場合、依存性チェッカーを検索すると、これらのアプリを使用してamazonのようなサービス間の依存関係をチェックする団体があります。

+0

私はxdebugを試してみます。ブルートフォースは、実際にはプログラムのサイズとその中のオプションの量のオプションではありません。それは永遠にかかります。 –

+0

それはデバッグツールです。ファイルやクラスを簡単に出入りすることができます。 – DarthVader

3

上記のように言及されているように、すべての参照ファイルがユーザーの入力に依存する可能性があるため、これらのファイルをすべて検索することは保証できません。しかし、最も単純な方法は、grepツールを使用することです(あなたのプラットフォームであればダウンロード可能な "Windows grep"アプリケーションがあります)。 "include"と "require"がすべて見つかるようにします。 deceze(変数名の後ろにincludeまたはrequireを付ける)という状況が発生した場合は、ファイルを手動で検査する必要がありますが、ファイル名が指定されている場合は、「used list」に追加することができます。

おそらく最も効果的な解決策ではなく、速く直感的です。

+0

私はそれを試してみましょう、それは100%正確ではない場合、私はそれがまだ大きな改善のすべてのデッドコードの90%を得ることができます大丈夫です。 –

+0

ここに大きな問題があると、オートローダが目に付きます。 – pinkgothic

1

get_included_files()関数を呼び出すと、含まれるすべてのファイルの配列を取得できます。各ファイルに以下のコードを追加することができます。このコードはインクルードされたすべてのファイルを "included.php"の配列に書き込みます。最も簡単な方法はauto_append_fileです。次に、アプリケーション全体をクリックします。すべてのファイルがinclude.phpに含まれるので、実際に使用されていないファイルを見つけることができます。

<?php 
function writeIncludes(array $includes) { 
    $filename = __DIR__ . '/included.php'; 

    $output = "<?php\nreturn "; 
    if(file_exists($filename)) { 
    $files = include($filename); 
    } 
    else { 
    $files = array(); 
    } 

    $files = array_merge($files, $includes); 
    $output .= var_export($files, true); 

    file_put_contents($filename, $output); 
} 

writeIncludes(get_included_files()); 

もちろん、このスクリプトはあなたの現在の摘要以外のデバッグには役に立ちませんが、十分に速く稼働させる必要があります。醜いかもしれないが、それはその仕事をするだろう。