40

悪夢であることが判明している PHP プロジェクトを継承しました。重要な点は次のとおりです。

  1. すべての元の開発者が去った
  2. コードにはバージョン管理がありません
  3. すべての開発とテストは、PHP ファイルの名前を変更して編集することにより、ライブ サーバー上で行われました。各ファイル index.php、index2.php、index3.php などの複数のコピーがあり、どのファイルが実際に使用されているか不明です
  4. 各ファイルには、他のファイルを含む他のファイルを含むファイルなどに複数のインクルードがあります。
  5. プロジェクトには複数の開発者がいて、それぞれが独自のやり方を持っていました。たとえば、ごちゃまぜの JavaScript フレームワークがあり、SQL を使用するデータベース クエリもあれば、XML インターフェイスを使用するものもあれば、データベース内の手続き型関数を呼び出すものもあります。

これらすべての問題のために、開発はイライラするほど遅くなります。私のフラストレーションを Stack Overflow にぶつけること以外に、この混乱を始める方法に関する推奨事項はありますか? 私自身、PHP開発はかなり初心者ですが、ライブサーバーを壊すことなく変更をテストできるように、ある種の開発環境をセットアップすることが最初のステップのようです。ここから始めるためのヒントはありますか?テストを行う一般的な方法は何ですか? デスクトップにサイトのローカル バージョンをセットアップするのは大変な作業のようです (サーバーは Linux ですが、ここのデスクトップは Windows です)。テスト用にライブ サーバーにサブディレクトリを作成できますか? データベースはどうですか?

次に、サーバー上のどのファイルが実際に使用されているかを追跡するために有効にできるプロファイリングはありますか? 実際には含まれていないものの名前が変更されたコピーを削除したいと思います。さらに良いことに、ファイルのどの部分が実行されていないかを知る方法はありますか? コピーされた関数やガベージがたくさんあり、使用されていないと思われます。同様に、インクルードについても、混乱を解消するためのヒントはありますか?

まあ、ここで発散するのをやめて、ここにいるみんなのなすがままに身を投じます。:)

4

27 に答える 27

56
  1. 何よりもまず、バージョン管理のファイルをそのまま取得します。完了するまで、#1 を超えて進まないでください。
  2. テスト環境を確立します。
  3. ファイルをクリーンアップする
于 2008-12-09T18:58:41.903 に答える
30

私はこれをやった。あなたは私の同情を持っています。パスポートが有効でない場合、または何らかの理由でこれを回避できない場合は、次のように対処します。

ステップゼロは、それがどんなにくだらないものであっても、バージョン管理に入れることです。それが機能していて、何かが壊れた場合は、動作状態に戻ることができる必要があります。または、少なくとも変更を比較して、何が問題なのかを突き止めます。リファクタリング中に頻繁に小さなチェックインを行うと、不可解な問題が発生した場合にロールバックするコードが少なくなります。(物事は不思議なことにうまくいかないでしょう。)

その後、データベースから始めます。すべてが比較的適切に正規化されていること、列に明確な名前が付けられていることなどを確認してください。

次に PHP コードを実行します。コードが本当にパッチワークのようなものである場合は、フレームワークに適合させます。CakePHPSymfonyを調べてみてください。懸念事項を分離する Rails 風の手法により、「このコードはどこに行くべきか?」という疑問が生じます。答えやすい。これは簡単な作業ではありませんが、一度完了すれば、適切に構築されたアプリを作成するための半分以上の成果が得られるでしょう。また、優れた Web フレームワークに組み込まれているテスト機能により、FAR のリファクタリングが容易になります。機能を変更する前に既存の機能をカバーするテストを作成すると、変更後に何かが壊れていないかどうかがわかります。

データベースを整理し、モデルにモデル コードを、コントローラーにコントローラー コードを配置したら、単一の JS/AJAX ライブラリでの標準化、CSS のクリーンアップなど、プレゼンテーション レベルの作業について心配することができます。

開発環境について: ローカルの開発環境は絶対にセットアップする必要があります。ターンキー WAMP パッケージが存在するか、Linux ボックス/VM にインストールできます (仮想化にはVirtualBoxをお勧めします)。また、ライブ サーバーを模倣する別の統合テスト環境も用意する必要があります。ライブ サーバーではライブ コードのみを実行する必要があります。

デバッグ/プロファイリング ツールに関しては、Symfony には非常に洗練された一連のツールが付属していることを知っています。これには、ページに (デバッグ モードでのみ) 表示される小さな JS ツールバーがあり、ログとプロファイリング情報が表示されます。

幸運を。

于 2008-12-09T19:25:33.113 に答える
17

さて、まず最初に。私はあなたがいる状況にありました、そしてそれはひどいです。開発環境を立ち上げて実行したいというあなたの考えは正しいと思います。

開発環境

これには、Web サーバー / スクリプト エンジン / データベース エンジン スタックと、ほとんどの場合 IDE が含まれます。

LAMPスタック インストーラーの場合、次のいずれかを使用することをお勧めします。

LAMP スタックに関する詳細情報:

O'Reilly の OnLamp サイト

優れたPHP IDEについては、次のいずれかを使用することをお勧めします。

いくつかの IDE を比較するIBM の開発者サイトの記事

ソース管理については、Team Foundation Server、SVN、または Git を使用できます。知っているものを使用してください。最初にすべてをソース管理に入れることをお勧めしますが (緊急のメンテナンスが必要な場合に備えて)、その後、かなり大規模なオーバーホールを行う予定です。

オーバーホール

あなたは、どのファイルが使用されているかさえ知らず、疑似バージョン管理としてファイル命名規則を使用していると述べました。開発環境が整ったら、そこでオーバーホールを開始することをお勧めします。あなたを助けることができるいくつかのことがあります:

  • アプリの顧客/ユーザー
  • 細心の注意を払って整理されたメモを取る
  • 優れたロギング フレームワーク

あなたの顧客/ユーザーは重要です。なぜなら、あなたはプロジェクトに不慣れなようで、彼らはアプリがあなたよりもうまく動作する方法を知っているからです (ほとんどの場合)。

細心の注意を払ってメモを取ることが重要です。基本的に、要件、設計、エンド ユーザーのドキュメントを一から書き直すことになるからです。それを行う場合は、内部を理解する必要があります。そして、このシステムについて何か理解しようとするなら、それを自分で書き留める必要があります (さもないと、スタック オーバーフローを読む代わりに、今すぐ既製のドキュメントを熟読することになります) ;-)

最後に、ロギング フレームワークは重要です。なぜなら、何かを修正する必要があり、壊れていることを知らないものを修正することはできないからです。ロギング フレームワークにより、明確な UI を持たないアプリの部分を可視化できます。これをアプリのさまざまな部分に挿入してログを確認すると、コードがいつどのような順序で実行されているかがわかります。

アプリがどのように動作するかを (紙に) 記録し、何も壊さないようにしながら、不要なファイルをゆっくりと削除することに集中する必要があります。デバッグに役立つログに注意してください。顧客が何かが壊れていると叫んでいないことを確認してください。メモが、ログに記録されている内容や顧客の発言と一致していることを確認してください。

今後はこれを防ぐ

すべてをソース管理に再チェックします。この時点で、より新しく、より健全で、より優れたディレクトリ構造にたどり着いていることを願っています。

テスト構造を整えます。これが、基本的な単体テスト フレームワークを用意し、デプロイのたびに基本的なスモーク テストを実行することを意味するだけだとしても、何もしないよりはましです。理想的には、デプロイのたびに時間をかけてテストできるテスト エンジニアまたは知識が豊富で信頼できる顧客が必要です。

複数の開発者が成長する場合は、展開プロセスを導入します。本番環境への変更を制御することが最優先事項です。環境の境界間を移動するための明確でシンプルなプロセスが必要です (Dev -> Test、Test -> Production など)。

于 2008-12-09T19:23:36.593 に答える
16

ほとんどの場合、ファイルが使用されているかどうかは、grep を使用して確認できます。

grep -r "index2.php" *

PHP パーサーを使用してクリーンアップすることもできます。以下は、宣言された関数と関数呼び出しを出力するスクリプトの例です。

#!/usr/bin/php
<?php
class Token {
    public $type;
    public $contents;

    public function __construct($rawToken) {
        if (is_array($rawToken)) {
            $this->type = $rawToken[0];
            $this->contents = $rawToken[1];
        } else {
            $this->type = -1;
            $this->contents = $rawToken;
        }
    }
}

$file = $argv[1];
$code = file_get_contents($file);

$rawTokens = token_get_all($code);
$tokens = array();
foreach ($rawTokens as $rawToken) {
    $tokens[] = new Token($rawToken);
}

function skipWhitespace(&$tokens, &$i) {
    global $lineNo;
    $i++;
    $token = $tokens[$i];
    while ($token->type == T_WHITESPACE) {
        $lineNo += substr($token->contents, "\n");
        $i++;
        $token = $tokens[$i];
    }
}

function nextToken(&$j) {
    global $tokens, $i;
    $j = $i;
    do {
        $j++;
        $token = $tokens[$j];
    } while ($token->type == T_WHITESPACE);
    return $token;
}

for ($i = 0, $n = count($tokens); $i < $n; $i++) {
    $token = $tokens[$i];
    if ($token->type == T_FUNCTION) {
        skipWhitespace($tokens, $i);
        $functionName = $tokens[$i]->contents;
        echo 'Function: ' . $functionName . "\n";
    } elseif ($token->type == T_STRING) {
        skipWhitespace($tokens, $i);
        $nextToken = $tokens[$i];
        if ($nextToken->contents == '(') {
            echo 'Call: ' . $token->contents . "\n";
        }
    }
}
于 2008-12-09T22:56:58.333 に答える
10

最悪の場合、コードはすべてスクランブルされ、すべての表示はロジックとデータベース呼び出しと混ざり合っています。1つのPHPプロジェクトでやらなければならなかったことを実行できます。

リファクタリングのアプローチを試すために、3つのスタートを切りました。それはまるでバイクで山登り法をしていて、毎回1​​0%の道を進んでいるようなものでした。それで、私は別のアプローチを取りました。

  1. ユーザーとしてログインしましたが、
  2. そして、私が見つけたすべての画面とすべてのユースケースを処理しました。
  3. HTMLを静的ファイルに保存しました。
  4. 手続き上の操作と明白なビジネスルールについてメモを取りました。

私はこれを3日間しっかりと行い、その後メモを取り、関係者と長い会話をしました。

いくつかの最初のステップについて合意を得た後、一貫性のある優れた設計と抽象化を使用して、すべてのhtmlUIを適切に再実装しました。ローリングした後、私は1日に2、3のスクリーンを行うことができました。

次に、結果を利害関係者に戻し、一連のユースケースを実行しました。(関係者は、ステップ1と2で非常に満足していました。とにかく最初の実装がまったく気に入らなかったため(驚き)、今では、正気の古いアプリの回復だけでなく、改善の希望があるように見えました。

それがハードワークの終わりであることが判明しました(そしてまた、利害関係者にとって認識されたプロジェクトリスクの終わりでもあります)。

最初の乗組員は自分たちの誤ったスパゲッティに縛られていたため、実際には作品の内容が比較的少なかったため、複製することは誰もが思っていたよりも範囲が狭かったことがわかりました。

しかし、重要な決定は、コンテンツと構造の両方の元のコードがリファクタリング不可能であり、適切に設計された新しいフレームワークを使用して完全に外観から作業する必要があるということでした。

于 2008-12-09T23:24:31.820 に答える
10
  1. 開発サーバーをセットアップします (Greg Hewgill が述べたように、VirtualBox と Virtual PC はこれに適しています)。

  2. 現在のサイト ファイル (関連する Web サーバーと PHP 構成を含む) をバージョン管理に入れます。

  3. 使用されているファイルを調べます。開発サーバーのセットアップを使用して、すべての fooN.php ファイルを削除してテストし、引き続き機能するかどうかを確認します。

  4. たくさん祈ってください(OK、これは必須ではありませんが、必要になるようです)。

于 2008-12-09T18:57:02.780 に答える
7

PHP の「xdebug」拡張機能を開発環境にインストールし、すべての関数呼び出しをトレースするように設定してから、アプリケーション全体を可能な限り完全に (おそらく自動化された UI テストを通じて) 実行することを検討してください。その後、xdebug トレース ファイルを分析/解析して、アプリケーションで使用されるすべてのファイル/関数を見つけることができます。

于 2008-12-09T19:38:46.330 に答える
6

このスレッドの他の人々は素晴らしいアドバイスを持っています。私もこの状況に陥ったことがあります。おそらく誰もが、竜巻に見舞われたようなプロジェクトに出くわしたことがあるでしょう。

追加したい 1 つの提案は、他の人が説明したクリーンアップを行う前に、経営陣の同意を得る必要があるということです。

  • このスレッドの提案に基づいて計画を立ててください。
  • 開発およびテスト環境を作成するために必要な新しいハードウェアまたはソフトウェアを説明し、それらの価格を提示してください。
  • 開発およびテスト環境をセットアップして使用するためにトレーニングする必要がある新しいスキルを把握します。これらのスキルを習得するために必要な時間と費用を見積もります。書籍や有料トレーニングなど。
  • クリーンアップを行うための作業スケジュールを見積もります。コードをソース管理下に置くのにどのくらいかかりますか? データベースを理解するのにどれくらいかかりますか? PHP と JavaScript のコードを理解するのにどれくらいかかりますか?
  • これをマネージャーに提示し、彼の収益に利益をもたらすという観点から目標を表現します。たとえば、すべてがクリーンアップされると、変更や新しい機能の展開がより迅速になり、エラーのデバッグがより予測可能になり、新しいスタッフの立ち上げが容易になります。

当然のことながら、現在の混乱を処理し続ける必要があります。これはライブ サイトであるためです。ライブ サイトの管理が優先されるため、クリーンアップ作業はバックグラウンド タスクである必要があります。つまり、さらに時間がかかります。バックグラウンド タスクとして中規模のプロジェクトをクリーンアップした経験では、通常 6 ~ 12 か月かかりました。サイトはこの期間にわたって進化し続けるため、完了したクリーンアップ タスクの一部を修正またはやり直す必要がある場合があります。マネージャーもこれをすべて理解していることを確認してください。

マネージャーが、この混乱を片付けるというあなたの計画をためらう場合、または片付けることに価値を感じない場合、少なくとも、他のすべての開発者がこの会社を去った理由を知ることができます!

続行する方法について、いくつかの具体的な提案があります。

  • 他のすべての優れたアドバイスに加えて、ジョエル テストをベンチマークとして使用することをお勧めします。クリーンアップの計画は、ジョエル テストで高得点を獲得できる仕事環境になるはずです。
  • 「なじみのないデータベースを理解するための最良の方法は何ですか?」に対する私の回答を読んでください。
  • どの PHP ページが実際に呼び出されているかを分析できるように、Web サイトでのログ記録を有効にします。少なくとも、index2.php、index3.php、index4.php などのどれが本当に時代遅れであるかがわかります。
  • PHP にはget_included_files()、現在のリクエスト中に含まれるすべてのファイルの配列を返す関数があります。この情報をログに記録することで、たとえ Web サーバーのログに表示されなくても、使用中の PHP ファイルを見つけることができます。
  • 本番サーバーと一致するテストおよび開発環境が本当に必要です。Windows でテストして Linux にデプロイするのはよくありません。開発中に MySQL 5.0 を使用し、本番環境で MySQL 4.0 を使用するのは良くありません。おそらく、より控えめな (互換性はありますが) ハードウェア プラットフォームで問題を解決できます。
于 2008-12-09T20:29:04.857 に答える
5

ページの下部にこれを配置すると、含まれている/必要なすべてのファイルのリストを表示できます。

<?php var_dump(get_included_files()); ?>
于 2008-12-12T01:45:50.237 に答える
5

私は...するだろう:

  1. 座って深呼吸してください。
  2. それが本当にあなたが働きたい場所かどうかを判断してください。
  3. はいと仮定すると、私は袖をまくり上げて、一度に作業する混乱を1つ選び、作業に取り掛かります.

一度に 1 つのタスクだけに制限することはできません。ただし、毎日のタスクに取り組みながら、一度に 1 つの混乱を解決することに作業を制限することができます。

于 2008-12-09T19:09:19.480 に答える
4

書き直しを検討し、古いサイトを機能仕様として使用する

驚いたことに、私が見る限り、誰もこれについて言及していませんが、別の選択肢があります。コードをあきらめて、サイト自体の機能を新しい機能セットの仕様として使用するだけです(つまり、これに対する最初の仕様です)。プロジェクト) を作成し、それらの機能に基づいて、確立されたフレームワーク (Symfony、Laravel、Drupal など) を使用してサイトを再構築します。

はい、邪悪な言葉の書き直しにうんざりする人がいます...しかし、これが実際にはより良い方法である場合がありあなたはいくつかの理由をほのめかしました:

  • あなたは PHP 開発の初心者です。
  • 継承した純粋ながらくたのコードではなく、きれいなものから始めたほうがよいでしょう。
  • 最終的な分析では、ほとんどのユーザーはソース コードを気にしません。ソース コードが「機能している」ように見えても、何かひどく間違っていることを伝えようとすると、彼らはあなたを狂ったように見るかもしれません。
  • 統一されたフレームワーク内でソース リビジョン管理とデータベース設計のプラクティスを習得すれば、より楽しく、より長生きすることができます。

確かに、この立場にいる人は皆、以前はこのようなコードで作業しなければなりませんでしたが、時にはそれで十分な場合もあり、スパゲッティを破棄して新しいプレートから始める方がよい場合もあります。

なぜ書き直しが悪いのかというJoel の記事を読めば、彼が挙げた状況がここであなたに当てはまることはほとんどないことに気付くでしょう。

于 2008-12-10T00:02:56.687 に答える
3
  1. 今すぐコードのバックアップを作成してください。

  2. バージョン管理。

  3. テスト サイトを作成します。サイトは Apache で実行されていますか? 自分のコンピューターに Apache+ PHP + MySQL をインストールして、それをテストに使用することもできます。

  4. セキュリティの問題に対処します。サイトが SQL インジェクションや電子メール インジェクションから保護されていることを確認してください。少なくとも、データベース呼び出しを検索して呼び出しを追加することができますmysql_real_escape_string()(MySQL データベースを使用している場合) ... コードをよりよく理解したら、後で実際の修正を行うことができます。電子メール インジェクションの場合 ... スパマー コードを除外するフィルタ関数を記述し、電子メールで使用されるすべてのフォーム フィールドがフィルタされるようにします。(ええ、スパゲッティ コードがさらに追加されますが、コードを大幅にリファクタリングする準備が整うまでにはしばらく時間がかかります。)

  5. その後、段階的なアップグレードをお勧めします。あなたは新しく、コードはごちゃごちゃしているので、すべてを理解するにはしばらく時間がかかります...そしてドメインを完全に理解するには. ですから、修正が必要なものを修正し、追加する必要があるものを追加して、少しだけ仕事に取り掛かります。そうしているうちに、システムがどのように組み立てられているかを学んでいます。コードがどのように構成されているか (または構成されていないか) が少しよくわかったら、システムの大規模なリファクタリング/書き直しの計画を開始できます。うまくいけば、コンポーネントごとにそれを行うことができるので、常に新しいマイルストーンをすぐに手に入れることができます.

于 2008-12-09T23:06:56.567 に答える
2
  1. リビジョン管理下に置いてください。

  2. 命名規則とファイル/ディレクトリ構造を決定します。

  3. 適切なツール/IDE があることを確認してください。

  4. 個別の開発/テスト環境をセットアップします (まだセットアップしていない場合)。

それから ...

  1. 残念ながら、これら 1、2、3 のファイルすべてをふるいにかけ、使用中のファイルと破棄できるファイルを判断する必要があります。ファイルごとに力ずくで粉砕する以外に方法はありません。

  2. 私は RCS を用意していますが、未使用のスクリプトと思われるものを .mausoleum などの隠し場所に移動し、RCS にその場所を無視させることがよくあります。レポに戻らずにローカルで覗けるのはいいですね。

  3. HTML と PHP を可能な限り分離します。私はこれを十分に強調することはできません!これが各ファイルで行われていれば問題ありません。PHP と HTML の個別のチャンクがある限り。もちろん、HTML にはあちこちにエコーが散りばめられていますが、すべてのテスト、スイッチ、その他すべてを HTML ブロックから PHP ブロックに移動するようにしてください。物事を整理することになると、これだけでも非常に大きなものになる可能性があります。

  4. コードが主に手続き型である場合(あなたの場合はそうだと思います)、深刻なリファクタリングまたはクラスへのリファクタリングを行う前に、最初にクリーンアップを行うのがおそらく最善です。

  5. 論理的に組み合わせることができるファイル/スクリプトを見つけたら、そうしてください。(プロジェクトを見たことがありますが、おそらくあなたのプロジェクトと同じで、生き残ったファイルの総数は、最初のプロジェクトの約 1/4 です)。

ここまで進んだら、適切なリファクタリングまたはクラスへのリファクタリングを開始できます。

ボンヌチャンス!

于 2009-03-02T17:50:19.167 に答える
2

あなたの5つのポイントはすべて、私が継承したいくつかの古典的なASPプロジェクトとPHPプロジェクトにも当てはまると思います...

できるだけ早くソース管理に入れ、VMWare、VirtualBoxなどをテスト環境に使用することについて、他の人に完全に同意します。

データベースのバージョン管理も行ってください。特に、手順に追加のロジックが含まれている場合 (単純な挿入、更新、削除だけではありません)。DB のバージョン管理は、php ページよりも注意が必要です。すべてのオブジェクトを SQL スクリプトに生成し、それらのスクリプトをソース管理に配置する必要があります。次に、データベース構造、手順などを変更すると、スクリプトを更新して、それらの変更の履歴も保持する必要があります。

データベース側で何が何を使用しているかを把握するには、ApexSQL Cleanを参照することをお勧めします。これを、数百の ASP ファイル、200 以上のテーブル、および約 400 のストアド プロシージャを含むプロジェクトで使用しました。使用されていない約 20 のテーブルと、ストアド プロシージャの約 25% を特定できました。ApexSQL Clean を使用すると、すべての php ファイルを、テーブル、ビュー、およびストアド プロシージャと共に依存関係チェックに追加できます。30日間の試用版を入手してチェックしてください。時間を大幅に節約できます.

Web サイトで使用されていたファイルについては、前月の Web サーバー ログを取得し、不明な点がないか検索を実行しました。また、アクセスされたときにログに記録するようにファイルを変更することについて、Aistina が提案したことのバリエーションも気に入っています。おそらく、ファイル名とアクセス数であるセットアップしたデータベースのテーブルに移動し、そのファイルがロードされるたびにカウントがインクリメントされます。その後、一定期間後、カウントを調べて、何ができるかを判断できます。

于 2008-12-09T19:24:04.317 に答える
2

もちろん、最初のステップは、バージョン管理下に置くことです。このようにして、少なくとも元の作業バージョンに戻ることができます。次に、include、require などの関数を上書きして、たとえば、含まれているファイルのファイル名をログ ファイルに書き込むことをお勧めします。この方法で、実際に含まれているファイルを見つけることができます (したがって、うまくいけば多くの index2.php、index3.php などを除外します。

必要に応じて、使用されているクラスと使用されていないクラスがあるかどうかを確認するには、get_declared_classes を get_defined_vars および gettype と組み合わせて使用​​して、どのタイプがインスタンス化されているかを確認できます。

問題 4 と 5 については、おそらく解決するのが少し難しいですが、うまくいけば、これで始めることができます。

于 2008-12-09T19:01:50.837 に答える
2

これに対処する方法についての有用な投稿がたくさんあります。

他の人が言ったことを繰り返そうとせずに:

  1. 実行中の prod 環境のコピーを取得します。これは、仮想マシンまたは別の実マシンです。しかし、あなたはそれについて神である必要があります。prod データベースが別のボックスにある場合は、dev バージョンも必要になります。
  2. すべてをバージョン管理に投げ込みます。別のボックスに。少なくとも毎週バックアップされるもの。
  3. バージョン管理アプリケーションで分岐がどのように機能するかを確認してください。あなたはおそらくそれを必要とするでしょう。
  4. prod サーバーをロックダウンします。バージョン管理から外れた変更をこれ以上加えたくありません。
  5. コードをバージョン管理から製品サーバーにリリースするための指示を作成します。リリース可能な変更の最小単位は、コード ベース全体である必要があります。

次のステップは、ユーザーがどの程度愛着を持っているかによって異なります。何らかの理由で大幅に変更できない場合は、漸進的なアプローチが必要になります。それでも開発と保守が必要な場合は、おそらくこれが唯一の選択肢です。その分岐機能を使用して、そのような mod を書き直し作業から切り離すことを忘れないでください。

構造に意味を持たせるには、基本的にそこにあるものと一緒に新しい構造を作成する必要があります。新しい DB ハンドラーは通常、開始するのに適した場所であり、すべてのページが読み込まれる汎用インクルード ファイルからインクルードされます。ここでの目標は、すべてのページに追加ファイルをロードするように指示することなく、後で拡張できる最小限のインクルード構造を作成することです。

次に、機能を新しいインクルード ファイルに移行する必要があります。マルチファイル エディタや screen+vi (または emacs) など、複数のファイルを一度に開く方法が必要になります。さまざまな場所で繰り返されるユーティリティ関数とコード ブロックから始めます。一度にたくさん修正することに気を取られないようにしてください。いくつかの問題は、他の問題が修正されるにつれて場所を移動する必要があります。後で戻ってきます。

サードパーティのフレームワークを追加する必要があるとは思わないでください。そのようなことをすぐに追加すると、完全な書き直しにつながります。この時点で、インクルード構造を調整するだけでなく、はるかに多くの作業が必要になります。ですから、まずそれを整理してください。

機能を移動すると、新しいインクルード ファイルを使用するファイルが必要になります。これを行う最初のいくつかのファイルは、しばらくの間競合を追跡します。がっかりして無意味に感じるかもしれませんが、これがおそらく最も難しい部分です. いくつかのファイルの後、簡単になります。ダースのインクルード ファイルを 1 つだけに置き換えることで、6 ページを新しいインクルード ファイルに移行できる場合があります。そのアクションの裏側は、削除できるファイルがあることです。

これを続けていくと、最終的にはすべてのインクルード ファイルが自分で作成したものになり、インクルード レイアウト全体に行き着くようになります。その時点までに、サードパーティのフレームワークを組み込むなど、より侵襲的な変更を行うことがはるかに簡単になります。

于 2008-12-10T04:31:47.813 に答える
2

ここにいくつかのアイデアがあります:

  • PHP と Apache は、Windows でも問題なく動作します。結局、すべて Windows のインストールを行うことができるのでしょうか?
  • grepすべての PHP ファイルで「include」と「require」を 'ing (または Windows の代替手段) にしてみてください。次に、見つかったすべてのインクルード ファイルのリストを作成します。リストをフォルダー内のファイルと比較します。少なくともいくつかの参照されていないファイルを取り除くことができるはずです。
  • または、すべてのファイル名のリストを作成し、すべてのファイルを検索します。このような依存グラフのようなものを作成できます。
于 2008-12-09T19:30:09.890 に答える
2

これは確かに混乱です。しかし、このことのいくつかの触手をどこで切り取るかについて創造的になるようになりましょう:

  1. バージョン管理を取得します。私はGitをお勧めします。
  2. ローカル開発サーバーをセットアップします。これは初めてなので、開始するための WAMP、LAMP、または MAMP パッケージを見つけてください。
  3. エントリ ポイント (index.php など) を見つけます。サーバーアクセスログをチェックして、これらが何であるかを確認してください。
  4. いくつかの正規表現の黒魔術に袖をまくり、すべてのファイルに include/require ツリーをダンプします。ただし、 include( $filename ) 動的インクルードには注意してください。これらのいずれかがある場合は、$filename にログを記録して、何が含まれている可能性があるかを調べる必要がありますが、その周りのコードから手がかりが得られるはずです。運が良ければ、この方法で未使用のファイルをすべて処分できます。
  5. 関数とメソッドがコードベースの他の場所で参照されていることを確認するには、より多くの正規表現の黒魔術を使用します。これに役立つ IDE があるかもしれません。NetBeans を試してみてください (C++ プロジェクトのリファクタリングを支援するために NetBeans を使用したので、ここで役立つ可能性があります)。
  6. 他の誰かが答えたように、「必要に応じて、使用されているクラスと使用されていないクラスがある場合は、get_declared_classes を get_defined_vars および gettype と組み合わせて使用​​して、どのタイプがインスタンス化されているかを確認できます。」コード ベース内のすべての新しいステートメントを見つけるためのコードを書くこともできます。
  7. などなど・・・この怪物をどうやって削っていくか考えてみてください。そして、できる限りコードを再編成してみてください。
于 2008-12-09T19:31:19.933 に答える
2

最初に行うことは、何らかの仮想マシンを使用してテスト環境をセットアップすることです。VirtualBox または Virtual PC が適しています。そうすれば、本番環境を壊すことを恐れずに変更を開始できます。これがどれだけの作業になるように見えても (データベースと Web サーバーとすべてで)、最終的にはそれだけの価値があります。大きな利点の 1 つは、VM をコピーして、支援が必要な場合に他の人に渡すことができることです。

于 2008-12-09T18:50:25.490 に答える
2

開発環境は必ず必要です。Windows ボックスでサイトを実行するのを台無しにしたくない場合は、Linux ディストリビューションの VMWare イメージを取得できます。

于 2008-12-09T18:53:52.083 に答える
2

お気持ち察します。そんなプロジェクトの発展を受け継いでいます。それは 1 年間私の心に残り、正直なところ、今日の開発者になりました。ひざまずいてたわごとに取り組むことほど、個人的な進歩の良い機会はありません。

これが私を最も助けたものです:

  • システムの重要なファイルを特定します。ほとんどの作業はそれらで行われるため、それらを見つけることができます
  • プロジェクトのローカル バージョン (データベースを含む) を作成し、バージョン管理下に置く
  • 小さな変更を加えた少量のファイルでのみ作業する
  • 完全にテストしてから、古いバージョンを元に戻す準備ができるまで、製品版には何も入れないでください。
  • システムのユーザーがどのように処理されるかを調べます (セッション、Cookie)。スーパーユーザーを作成し、システム上でコードをライブでテストする必要がある場合は、次のようにブロックに入れます。

    if($_POST['your_registered_user_name']{
       //Your live code being tested, which will be visible only to you when you are logged in
    }
    

    他のユーザーは変化を感じることができません。この手法は、ローカル マシンのシステム状態を置き換えることができなかったときに大いに役立ちました。

  • テストを記述し、記述しているすべてのコードについて厳密なエンジニアリング ガイドラインに従ってください

于 2008-12-09T22:09:39.957 に答える
1

はい、バージョン管理は間違いなくステップ 0 です。

また、優れたCode Search Toolもお勧めします。

Agent Ransackは非常に優れています (Windows を使用している場合) http://www.mythicsoft.com/agenttransack/Page.aspx?page=download

コード検索がなければ、盲目的に飛んでいたでしょう。

于 2009-01-11T19:55:53.323 に答える
1
  1. プロジェクトでバージョン管理の使用を開始します (git をお勧めします)
  2. すべてのコードの単体テストを書く
  3. ORMの使用を開始します(教義を強くお勧めします)
  4. フレームワークの使用を開始します (symfony/nette をお勧めします)
  5. PHPコードのリファクタリングを開始
于 2010-12-02T07:54:46.387 に答える
1

私はちょうどこれを自分で経験しました。

私の一番の秘訣は、初日からすべてを変えようとしないことです。本当にこの問題を解決したいのなら、友達が必要です。同僚が何ヶ月も (何年も?) 取り組んできたものすべてを変更する方法を提案する前に、同僚に敬意を払う必要があります。

まず、コードをできるだけ早くバージョン管理下に置きます。それが簡単ではない場合は、少なくとも毎日のバックアップの作成を開始してください。ファイルを圧縮し、zip ファイルに日付を付けて名前を付けるだけでも構いません。バージョン管理について誰も知らない場合は、CVS または SVN に関する実用的なプログラマー向けの本を購入して、自分でセットアップしてください。本は 1 日で読むことができ、すぐに使い始めることができます。他の誰もバージョン管理を使用したくない場合は、自分で使用できます...その後、誰かがファイルを失ったときに、リポジトリからのコピーでその日を救うことができます。遅かれ早かれ、他の人々はバージョン管理という知恵に気付くでしょう。

第二に、可能な限りコードに飛び込みます。それを生きて、一ヶ月間呼吸してください。あなたが彼らのコードを学ぶつもりであることをそこにいる人々に示してください。

第 3 に、コードを確認しながら、大量のメモを取ります。コードについて気になることをすべて書き留めます。自分の考えを紙に書き出すだけです。月 1 の後で、後で整理できます。

4 番目に、コード プロファイラー (xdebug など) をインストールします。これにより、各ページで呼び出されているファイルと関数、および各コードの実行にかかる時間がわかります。これを使用して、インクルードの問題を把握し、遅いコードを見つけることができます。最初にそれらを最適化します。

1 か月間懸命に作業し、コードをふるいにかけ、メモを取った後、メモを適切なドキュメントに変換します。さまざまなセクションは、セキュリティからキャッシング、アーキテクチャ、その他の気になることまでさまざまです。批判するたびに、より良い解決策と、修正にかかる時間を見積もってください。これは、競合するすべての JavaScript フレームワークなどを取り除く場所です。

このドキュメントは可能な限り改訂してください。 私はそれを十分に強調することはできません。

個人的な好みだけでなく、会社の利益のためにやっていることが聴衆に伝わるようにしてください。

直接上司に提出してください。それについて話し合う時間を設定します。

彼らはそれを書いたためにあなたを解雇する可能性があります. もしそうなら、彼らは改善を望んでおらず、あなたのキャリアは停滞するので、あなたは彼らがいなくても良いでしょう.

彼らはあなたの推奨事項をすべて実装したいと思うかもしれません。可能性は低いですが、可能です。そうすれば、あなたは幸せになるでしょう(あなたの推薦が失敗しない限り).

ほとんどの場合、彼らはあなたの推奨事項のいくつかを実装したいと思うでしょう。それは何もしないよりはましです。少なくとも、それはあなたの懸念を和らげるのに役立ちます.

テストに関しては、Apache で別の「仮想ホスト」をセットアップします (Windows と Linux の両方でサポートされています)。仮想ホストを使用すると、1 つのサーバーで複数のサイトを実行できます。ほとんどの大規模なサイトには、少なくとも 3 つの仮想ホスト (または実際のサーバー) があります。 com (本番サーバー)。また、誤って混乱しないように、異なるログインとパスワードを使用して、データベースの開発、ステージング、および運用バージョンをセットアップする必要があります。

別の解決策は、各開発者に Linux サーバー上の独自の仮想ホストを提供することです。開発者は FTP/SCP または samba を使用したネットワーク共有を介して作業できます。

幸運を!

于 2008-12-11T02:29:24.160 に答える
0

ハーパー・シェルビーが言ったことを実行してください...

ただし、これを解決するための管理サポートを受けられない場合は、何らかの理由でこのようになる可能性があるという事実を受け入れたいと思うかもしれません. ... 言ってるだけ。;-)

于 2008-12-09T19:29:07.660 に答える
0

サイトで詳細な統計情報を取得して、入口と出口のポイントを見つけてください。どのファイルが一番上にヒットしているかを調べる適切な方法です (そして、それらのファイルを調べて、どのインクルードがプルされているかを確認します)。

于 2008-12-09T18:58:24.040 に答える
0

他の人が言った素晴らしいことに加えて、どのファイルがアクティブに使用されているかを最初に確認するために、APC や eaccelerator などのオペコード キャッシュを開発サーバーにインストールできます (または運用サーバーでさえ、これは壊れません)。なんでも)。次に、開発サーバーで Web アプリをクリックします (または、運用サーバーでユーザーに実行させます)。

次に、キャッシュ管理ページでキャッシュされたファイルのリストを見てください。ファイルがオペコード キャッシュによってキャッシュされているとリストされていない場合、そのファイルが読み込まれていない可能性が高くなります。

これは完全な解決策ではありませんが、各ディレクトリに 10 個の index.php ファイル (index.php、index2.php など) がある場合、少なくともどれがアプリで使用されているかがわかります。

于 2008-12-11T02:35:54.863 に答える