この記事では、PHP プログラマーが Web 開発、特に中規模および大規模なプロジェクトを扱う場合に見落としがちないくつかの重要な間違いをまとめています。典型的なエラーには、さまざまな開発環境を区別できないことや、キャッシュとバックアップの使用に失敗することが含まれます。
以下では例として PHP を使用しますが、その中心的なアイデアはすべての Web プログラマーに適用できます。
アプリケーション レベルのエラー
1. 開発段階ではエラー報告がオフになっています
私が聞きたいのは、なぜですか?開発中にエラー報告をオフにする必要があるのはなぜですか?
PHP にはさまざまなレベルのエラー報告機能があり、開発段階ではそれらをすべて有効にする必要があります。
エラーが起こらないと考えるなら、それはプログラムを理想化していることになり、現実の世界ではエラーは避けられません。 error_reporting と display_error はまったく異なる 2 つのメソッドです。error_reporting() はエラー レベルを設定し、display_errors はエラー情報を出力するかどうかを設定します。
開発段階では、エラー報告のレベルを次の設定のように最高レベルに設定する必要があります: error_reporting(E_ALL); および ini_set('display_errors', true);
2. 逆に多くのプログラムでは、メンバーは間違いが起こることを知っていながら、それを隠すことを選択し、将来さらに重大な間違いが起こるとは知らずに、早く家に帰って寝ることができます。
3. コードのどこにも使用ログはありません
ソフトウェア開発の開始時に使用ログを念頭に置く必要があり、プロジェクトが終了するまでログ機能を補うことはできません。多くのプログラマーは何らかの方法でログを記録しますが、実際にログを使用して異常な情報を記録できる人はほとんどいません。誰もチェックしないログ システムは何に役立つのでしょうか。
4. キャッシュは使用されません
私たちのアプリケーション システムでは、サーバー側、アプリケーション側、データベース側など、複数のシステム レベルでキャッシュを使用できます。ログと同様に、キャッシュは最初からシステムに適用する必要があります。開発中はキャッシュを無効にし、製品リリース後にキャッシュを有効にすることができます。
5. ベスト プラクティスとデザイン パターンを放棄する
独自のパスワード暗号化アルゴリズムを使用している人を何人見たことがありますか?申し訳ありませんが、彼らは自分たちの方がよく知っているだろうと考えているため、たくさんいます。
ベスト プラクティスとデザイン パターンは、多くの場合、自分で車輪を再発明するよりも簡単で効果的です。たとえば、これらのデザイン パターンをプロジェクトに適切に適用するだけです。暗号化アルゴリズム。
6. 自動テストは使用されません
テストはログと同じように、すべての Web プロジェクトで使用されます。誰も管理および使用しない場合、テストは役に立ちません。
テスト プロジェクトの実行は面倒な作業です。幸いなことに、自動テストの実現に役立つ一連のツールがあります。 PHP 開発には、Jenkins と呼ばれる優れたテスト ツールがあり、非常に便利です。
7. コードレビューはありません
メンバーそれぞれが異なる作業習慣や方法を持っているため、チームで作業することは非常に大きな課題です。適切な仕様がなければ、プロジェクト開発は多くの回り道を必要とします。
チームのメンバー全員が互いのコードをレビューする必要があります。単体テストと同じように、プロジェクトをよりクリーンで一貫性のあるものにするのに役立ちます。
8. プログラミングは理想的な状況のみを考慮します
顧客に引き渡された後、自分または他の人のコードで問題や混乱に遭遇したことがありますか?もちろんそうではありませんでした。
このような状況は、開発者が怠け者で理想的な状況だけを考えるために頻繁に発生し、データベースのクラッシュ、PHP の致命的なエラー、さらにはサーバーのハッキングにつながる可能性があります。コードを記述するとき、プログラマは最良のシナリオだけでなく、最悪のシナリオも考慮する必要があります。包括的に考えることによってのみ、コードはすべての状況をカバーすることができます。
9. オブジェクト指向プログラミングのアイデアを正しく適用できない
ほとんどの PHP 初心者は、オブジェクト指向のアイデアを最初は理解するのが難しいため、コードにオブジェクト指向のアイデアを使用しません。
もちろん、オブジェクト指向の概念は、単にいくつかのクラスをまとめて編成するということではありません。
オブジェクト、プロパティ、メソッド、継承、カプセル化は、OOP の最も基本的な概念です。開発者がオブジェクト指向の設計パターンを正しく使用すると、よりクリーンでスケーラブルなコードを作成できるようになります。
10. 「オンザフライ」プログラミング
ほとんどの開発者は次のような状況に遭遇するでしょう: 「急いで、顧客はできるだけ早く実行できる新しい機能を必要としています」実行中のサーバーに直接アップロードします。このプログラミング方法を「オンザフライ」プログラミングと呼びます。
ソフトウェア、特に中規模および大規模プロジェクトを開発する場合、分析、プログラミング、リリースのワークフローに従う必要があります。これにより、将来のソフトウェアのバグが大幅に減少します。この「フライトモード」はお勧めできません。
データベースレベルのエラー
11. データベースの読み取りと書き込みの分離の失敗
複雑なシステムを長期間実行するために、すべてのプログラマーはシステムのスケーラビリティを考慮する必要はありません。それほど大量のトラフィックがないため、% の確率で拡張されます。
データベースの読み取りと書き込みを分離する必要があるのはなぜですか?
どのシステムでも、大規模なトラフィックの影響で最初にボトルネックが発生するのはデータベースです。そのため、ほとんどの場合、トラフィックを分散するために複数のデータベースを使用し、開発者はマスター/スレーブ モードまたはマスター/マスター モードを使用することがよくあります。マスター/スレーブは最も一般的なデータベース プレッシャー共有モードで、指定された select ステートメントが各スレーブ サーバーにルーティングされるため、マスター サーバーのプレッシャーが大幅に軽減されます。
12. コードは 1 つのデータベースにのみ接続できます
これは前のエラーと非常によく似ていますが、開発者はユーザー ログ、アクティビティ情報ストリーム、リアルタイム データなどの何らかの理由で複数のデータベースに接続する必要がある場合があります。分析などの高負荷データを別のデータベースに配置して、メイン データベースへの負担を軽減します。
13. データベースの脆弱性の検出に失敗する
データベースの脆弱性を検出しない場合、それはほとんどのハッカーに対してサーバーのドアを開けてしまうのと同じです。
多くの脆弱性の中で、データベースの脆弱性が最も脆弱であり、最も一般的なのは SQL インジェクションです。したがって、データベースの脆弱性検出を定期的に行う必要があります。
14. データテーブルにインデックスを作成しないでください
インデックスはデータテーブルで非常に重要な役割を果たします。インデックスを作成する方法とインデックスを作成するタイミングについては、次の記事を参照してください。
15. トランザクションメカニズムは使用されません
Web システムにとってデータの整合性は非常に重要です。データの整合性にエラーが発生すると、システム全体が崩壊し、修復が困難になります。データベース トランザクション メカニズムを適切に使用すると、この問題は効果的に解決されます。たとえば、ユーザー データを保存する場合、テーブル 1 には電子メール、ユーザー名、パスワードがあり、テーブル 2 には名、姓、性別、年齢が含まれます。トランザクションを使用すると、2 つのテーブルを更新するときにデータが同時に更新されるか、または同時に更新されないようにできます。
16. 機密データの暗号化なし
データベース内の機密情報を暗号化しない場合、または単純なアルゴリズムで暗号化した場合、2014 年には確実に厄介な問題に遭遇することになります。ハッカーがデータベースに侵入すると、ユーザーのパスワードやその他の重要な情報が一目でわかります。
PHP5.5 はハッシュ暗号化方式を提供しており、その使用方法は次のとおりです:
$hash = password_hash( $password, PASSWORD_BCRYPT );
17. バックアップがありません
そのような状況に遭遇し、バックアップがなければ、すべてが暗号化されてしまいます。終わる 。
18. 監視しない場合
監視しないと、次に何が起こるかわかりません。
このアプリケーション サービスに直接アクセスできる人は何人ですか?
サーバーが高負荷で実行されていますか?
別のデータベースサーバーを使用してシステムを拡張する必要がありますか?
アプリケーションシステムの障害点はどこですか?
システムは現在オフラインですか?