ウェブサイトのパフォーマンスの最適化は、大規模なウェブサイトにとって非常に重要です。ウェブサイトのアクセス速度が遅いと、直帰率が高くなります。ただし、大規模なウェブサイトの場合、これは簡単に解決できます。コラム、写真、画像は比較的大きいので、全体のパフォーマンスを最適化するにはどうすればよいですか?この記事では、大規模な PHP Web サイトのパフォーマンスと同時アクセスの最適化計画について説明します
1. 大規模な Web サイトのパフォーマンス向上戦略:
ポータル Web サイトなどの大規模な Web サイトは、多数の課題に直面しています。基本的なソリューションは、高性能サーバー、高性能データベース、高効率プログラミング言語、および高性能 Web コンテナの使用に重点を置いています。これらのソリューションは、ある程度大きな投資を意味します。
Web コンテナは、サーバーのポート上で対応するサービスを提供するプログラムであり、このプログラムは、JAVA の Tomcat コンテナ、ASP の IIS コンテナ、または PWS コンテナなど、クライアントからのリクエストを処理します。サーバーには複数のコンテナーを含めることができます。
1. 静的 HTML
実際、最も効率的で消費が最も少ないのは純粋に静的な HTML ページであることは誰もが知っているため、私たちは Web サイトのページには静的ページを使用するよう最善を尽くしています。これが最も簡単な方法です。実は最も効果的な方法なのです。
2. 画像サーバーの分離
ご存知のとおり、Web サーバーでは、Apache、IIS、その他のコンテナーのいずれであっても、画像が最も多くのリソースを消費するため、画像をページから分離する必要があります。基本 これは、大規模な Web サイトで使用される戦略であり、すべての Web サイトには独立した、または複数の画像サーバーがあります。このようなアーキテクチャにより、ページ アクセス リクエストを提供するサーバー システムへの負荷が軽減され、画像の問題によるシステムのクラッシュを確実に防ぐことができます。
アプリケーション サーバーとイメージ サーバーでは、さまざまな構成の最適化を実行できます。たとえば、Apache は、ContentType を構成するときにサポートする LoadModules をできるだけ少なくして、システム消費量と実行効率を高めることができます。
3. データベースクラスター、データベーステーブルハッシュ
大規模なウェブサイトには複雑なアプリケーションがあり、これらのアプリケーションは大量のアクセスに直面すると、この時点でデータベースのボトルネックがすぐに明らかになります。 1 つのデータベースではすぐにアプリケーションを満たすことができなくなるため、データベース クラスタリングまたはデータベース テーブル ハッシュを使用する必要があります。
データベース クラスターに関しては、多くのデータベースが独自のソリューションを持っており、MySQL が提供する一般的に使用されるマスター/スレーブも同様のソリューションです。
クラスターは通常、CDN、GSBL、および DNS 負荷分散テクノロジーを使用します。例: NetEase と Baidu は、DNS 負荷分散テクノロジーを使用します。テクノロジーでは、すべてのチャネルがフロントエンド サーバー クラスターを共有します。
ライブラリ テーブルのハッシュは、一般的に使用され、最も効果的なソリューションです。
アプリケーションにビジネスモジュールとアプリケーションモジュール、または機能モジュールをインストールして、異なるモジュールが異なるデータベースまたはテーブルに対応し、ユーザーテーブルなどの特定の戦略に従って、特定のページまたは機能で小さなデータベースハッシュを実行します。ユーザー ID に従ってハッシュ化されるため、低コストでシステムのパフォーマンスを向上させることができ、優れた拡張性を備えています。
sohu のフォーラムは、フォーラムのユーザー、設定、投稿、その他の情報をデータベースに分離し、投稿とユーザーをセクションと ID に従ってデータベースとテーブルにハッシュするという構造を採用しています。この構成により、システムはいつでも低コストのデータベースを追加して、システムのパフォーマンスを補うことができます。
4. キャッシュ
技術者なら誰でもキャッシュという言葉を聞いたことがあるでしょう。キャッシュはさまざまな場所で使用されています。 Web サイトのアーキテクチャおよび Web サイト開発におけるキャッシュも非常に重要です。ここではまず、最も基本的な 2 つのキャッシュについて説明します。高度な分散キャッシュについては後で説明します。
アーキテクチャ上のキャッシュに関しては、Apache に詳しい人なら誰でも、Apache が独自のキャッシュ モジュールを提供しており、追加の Squid モジュールをキャッシュに使用することもできることを知っているでしょう。これらの方法は両方とも、Apache のアクセス応答機能を効果的に向上させることができます。
Web サイトのプログラム開発におけるキャッシュ、Linux で提供される Memory Cache は、Web 開発で使用できる一般的に使用されるキャッシュ インターフェイスです。たとえば、Java で開発する場合、MemoryCache を呼び出して一部のデータをキャッシュし、通信することができます。大規模なコミュニティ この構造が使用されます。さらに、Web 言語開発を使用する場合、基本的に各言語には独自のキャッシュ モジュールとメソッドがあります。PHP には Pear の Cache モジュールがあり、Java には .net がさらにあると思います。
5. ミラーリング
ミラーリングは、パフォーマンスとデータのセキュリティを向上させるために大規模な Web サイトでよく使用される方法であり、ChinaNet と EduNet の間など、ネットワーク アクセス プロバイダーや地域によって生じるユーザーのアクセス速度の違いを解決できます。これらの違いにより、多くの Web サイトが教育ネットワーク内にミラー サイトを構築し、データは定期的またはリアルタイムで更新されています。
6. 負荷分散
負荷分散は、高負荷のアクセスと多数の同時リクエストを解決する大規模な Web サイト向けのハイエンド ソリューションになります。
負荷分散テクノロジーは長年にわたって開発されており、多くの専門的なサービスプロバイダーや製品から選択できますが、そのうちの 2 つは誰もが参考にすることができます。 PHP コード記述の最適化:
1. Echo は print よりもはるかに高速です。
どちらのメソッドもページ上に内容を印刷しますが、echo は値を返さず、print は成功または失敗時に 0 または 1 を返します。
2. include_once は include よりも時間がかかります。
含めたいクラスが含まれているかどうかを確認する必要があるため。
3. 長い段落文字列には二重引用符ではなく必ず一重引用符を使用してください。
二重引用符は文字列内の変数を検索するためです。例: echo ‘This is long string’.$name は echo ‘This is long string $name’ よりもはるかに高速です。
4. ループ内でネストされた for ループを使用しないでください
5. 関数を静的として定義できる場合は、静的関数はメンバーよりも 33% 高速です。機能。
6. 正規表現を使用せずに問題を解決できる場合
は、正規表現を使用しないでください。正規表現は、PHP のネイティブ関数よりも遅くなります。 たとえば、preg_replae の代わりに str_replace を使用します。7. ファイルを含めるのに相対パスを使用しないようにしてください
相対パスでファイルを検索する場合、ファイルは現在のディレクトリで検索され、その後、順番に再度検索されます。これにより、ファイルの検索が非常に遅くなります。最初に WEB_ROOT のような定数を定義し、次にこの定数を使用してファイルをインクルードすることをお勧めします。8. 合同記号 === は等価 ==
より高速であり、if(1 == '1') は true を返し、if(0 == ”) も true を返します。 use 合同シンボルが使用されている場合、if(1 ==='1') と if(0===”) は両方とも false を返します。したがって、プログラム内でいくつかのブール変数を検出する必要がある場合は、合同記号を使用するのが最善です。3. thinkphp には次の方法があります
1. デバッグ モードをオフにする
デバッグ モードをオフにすると、システムは自動的にプロジェクトのコンパイル キャッシュを生成し、ログの書き込みをオフにするため、大量の IO ロードとログ書き込みオーバーヘッド。
2. ページ圧縮出力をオンにする
バージョン 3.1 以降、ページ圧縮出力を制御するために OUTPUT_ENCODE 構成パラメーターが追加されました。3. キャッシュを有効にする
Web サイト展開環境に APC または Xcache キャッシュをインストールすると、Web サイトのパフォーマンスとメモリ使用量を効果的に改善できます XCache はオープンソースのオペコード キャッシュ/オプティマイザーであり、サーバーの PHP パフォーマンスを向上させることができます。コンパイルされた PHP データを共有メモリにバッファリングすることで、繰り返しのコンパイル プロセスを回避し、バッファリングされたコンパイル済みコードを直接使用して、ページの生成速度を 2 ~ 5 倍向上させることができます。代替 PHP キャッシュ。 (APC) は、オペコードの PHP 中間コードをキャッシュできる PHP 用のオープンソース キャッシュ ツールです。
4. フィールドキャッシュ
デフォルトでは、フィールドキャッシュは開発完了後、基本的にデータベースの変更が少なくなるため、対応するモデルクラスにフィールドキャッシュをマージすることを検討できます。各読み取りフィールド キャッシュの IO オーバーヘッド。マージの方法は、Runtime/Data/_fields で対応するフィールド キャッシュ ファイルを見つけることです4. データベースの最適化
1. 適切なストレージ エンジンを選択します
2 つのストレージ エンジン MyISAM を含む MySQL を例に挙げますと InnoDB の各エンジンには長所と短所があります。
MyISAM は、大量のクエリを必要とするアプリケーションに適しています。 InnoDB の傾向は非常に複雑なストレージ エンジンとなり、一部の小規模なアプリケーションでは MyISAM よりも遅くなるでしょう。ただし、「行ロック」とトランザクションはサポートされています。2. フィールドのデータ型を最適化します
列が小さいほど高速になるという 1 つの原則を覚えておいてください。ほとんどのデータベース エンジンにとって、おそらくハードディスク操作が最も重大なボトルネックとなります。したがって、データをコンパクトにすることは、ハード ドライブへのアクセスを減らすため、この状況では非常に役立ちます。 テーブルに数個の列しかない場合 (ディクショナリ テーブル、構成テーブルなど)、主キーとして INT を使用する理由はありません。MEDIUMINT、SMALLINT、またはそれより小さい TINYINT を使用する方が経済的です。時間を追跡する必要がない場合は、DATETIME よりも DATE を使用する方がはるかに優れています。もちろん、拡張のための十分な余地も残しておく必要があります。3. 検索フィールドにインデックスを追加します
インデックスは必ずしも主キーや唯一のフィールドを意味するわけではありません。テーブル内に常に検索に使用するフィールドがある場合は、検索するフィールドが大きなテキスト フィールドでない限り、そのフィールドにインデックスを作成することをお勧めします。4. データベースからさらにデータを読み取るために Select * を使用することは避けてください。
その後、クエリは遅くなります。また、データベースサーバーとWEBサーバーが独立した2台のサーバーの場合、ネットワーク通信の負荷も大きくなります。データ テーブル内のすべてのフィールドをクエリする場合でも、* ワイルドカード文字を使用しないようにしてください。組み込みのフィールド除外定義を活用すると、より便利になる場合があります。
5. VARCHAR の代わりに ENUM を使用します
ENUM 型は非常に高速でコンパクトです。実際には、TINYINT を保持しますが、文字列として表示されます。このようにして、このフィールドを使用して選択リストを作成するのが非常に完璧になります。たとえば、性別、民族、部門、ステータスなどのフィールドの値が限定されており、固定されている場合は、VARCHAR ではなく ENUM を使用する必要があります。
6. 可能な限り NOT NULL を使用してください
NULL 値を使用する特別な理由がない限り、フィールドは常に NOT NULL のままにしてください。 NULL は実際には余分なスペースを必要とするため、比較を実行するとプログラムがより複雑になります。 もちろん、これは NULL を使用できないという意味ではありません。現実は非常に複雑なので、NULL 値を使用する必要がある状況が依然として存在します。
7. 固定長テーブルは高速になります
テーブル内のすべてのフィールドが「固定長」の場合、テーブル全体が「静的」または「固定長」とみなされます。 たとえば、テーブルには VARCHAR、TEXT、BLOB 型のフィールドはありません。これらのフィールドのいずれかを含めている限り、テーブルは「固定長の静的テーブル」ではなくなり、MySQL エンジンは別の方法でテーブルを処理します。
固定長テーブルは MySQL の検索速度を向上させるため、次のデータのオフセットの計算が容易になり、当然読み取りも高速になります。また、フィールドが固定長でない場合、次のフィールドを検索するたびに、プログラムは主キーを検索する必要があります。
また、固定長テーブルはキャッシュと再構築が簡単です。ただし、唯一の副作用は、固定長フィールドは使用するかどうかに関係なく非常に多くのスペースを必要とするため、固定長フィールドによってスペースが浪費されることです。
「垂直分割」テクノロジーを使用すると、テーブルを 2 つに分割し、1 つは固定長、もう 1 つは可変長にすることができます。
8. 垂直分割
「垂直分割」は、データベース内のテーブルを列ごとに複数のテーブルに変換する方法であり、テーブルの複雑さとフィールドの数を軽減し、それによって最適化の目的を達成できます。
例: User テーブルには自宅の住所というフィールドがありますが、これはデータベースで操作する場合の個人情報を除いて、頻繁に読み取ったり書き換えたりする必要はありません。それで、なぜ彼を別のテーブルに置いてはいけないのでしょうか? これにより、テーブルのパフォーマンスが向上します。多くの場合、ユーザー テーブルでは、ユーザー ID、ユーザー名、パスワード、ユーザー ロールなどのみが頻繁に使用されます。テーブルが小さいほど、常にパフォーマンスが向上します。
さらに、これらの分割されたフィールドで構成されるテーブルを頻繁に結合しないように注意する必要があります。そうしないと、分割していない場合よりもパフォーマンスが低下し、極端なレベルで低下します。
9. SELECT クエリを EXPLAIN する;
EXPLAIN キーワードを使用すると、MySQL が SQL ステートメントをどのように処理するかを知ることができます。これは、クエリ ステートメントまたはテーブル構造のパフォーマンスのボトルネックを分析するのに役立ちます。 EXPLAIN のクエリ結果には、インデックスの主キーがどのように使用されるか、データ テーブルがどのように検索および並べ替えられるかなどもわかります。
通常、より複雑な SELECT ステートメント、特に複数のテーブルが関与するステートメントの先頭にキーワード EXPLAIN を追加できます。これを行うには phpmyadmin を使用できます。詳細については、添付ファイルの Explain.doc を参照してください
5. フロントエンドの最適化
バックエンドとデータベースを最適化した後、次に行う必要があるのは、フロントエンド ページとリソース ファイルを最適化することです。主に画像を含む出力ページ、JS およびスタイル ファイルの最適化。
検出と分析には次の Web ページのパフォーマンス テスト ツールを使用することをお勧めし、関連する最適化の提案を提供します:
PageSpeed Google によって開発されたツール
ウェブマスターと Web 開発者は、PageSpeed を使用して、 Web ページのパフォーマンスを調査し、パフォーマンスを向上させる方法についての提案を受け取ります。
yslow YSlow
は、ウェブサイトのページを分析し、ウェブサイトのパフォーマンスを向上させるために特定のルールに基づいて最適化する方法を教えてくれます。
関連記事:
PHP ウェブサイトのパフォーマンス最適化の実践: 淘宝網ホームページの読み込み速度の最適化の実践
以上が大規模な php Web サイトのパフォーマンスと同時アクセスの最適化ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。