私はPHP
サイトを構築していますが、今のところPHP
私が使用しているのは、特定のページに含まれる半ダースほどです。(最終的には、いくつかのデータベース クエリを使用する予定です。)
static とは対照的に、単純なinclude()
ステートメントは速度またはスケーリングの懸念事項HTML
ですか? サイトが動かなくなる原因はどのようなものですか?
私はPHP
サイトを構築していますが、今のところPHP
私が使用しているのは、特定のページに含まれる半ダースほどです。(最終的には、いくつかのデータベース クエリを使用する予定です。)
static とは対照的に、単純なinclude()
ステートメントは速度またはスケーリングの懸念事項HTML
ですか? サイトが動かなくなる原因はどのようなものですか?
確かに include() は静的ページよりも遅いです。ただし、最新のシステムでは、これが長い間ボトルネックになることはほとんどありません。私の意見では、インクルードを使用してサイトの共通部分を最新の状態に保つことの利点は、わずかなパフォーマンス ヒットよりも重要です (更新を忘れたために 1 つのページに異なるナビゲーションが表示されると、ユーザー エクスペリエンスが低下し、サイトに対する不快感が生じます)。サイト/会社/何でも)。
キャッシュを使用しても実際には役に立ちません。コードのキャッシュは include() よりも遅くなります。キャッシュが役立つのは、計算負荷の高い計算を行う場合 (Web ページでは非常にまれです)、またはデータベースからデータを取得する場合のみです。
少し時期尚早の最適化に参加しているようですね。アプリケーションがビルドされていない場合、パフォーマンスの懸念は知っておくとよいでしょうが、主な懸念はアプリを作成することです。
インクルードは人生の事実です。数について心配する必要はありません。コードを適切に整理することについて心配してください(Zend Frameworkクラスファイルの構造を見て、私が何について話しているのかわからない場合は、PEARフォルダー構造は素晴らしいものです)。
妥当な量の抽象化でアプリケーションを作成することに焦点を当てます。すべてのDB呼び出しを1つまたは複数のクラスにグループ化して、コードの重複(KISSの原則およびすべて)を最小限に抑え、クエリをリファクタリングして最適化するときに、それらが中央に配置されるようにします。また、リグレッションを防ぐために、いくつかのユニットテストを開始します。
アプリケーションが起動して実行されたら、ボトルネックがどのようになるかは各アプリケーションに依存するため、何が高速で優れているかを尋ねないでください。インクルードがたくさんあるのに、ループが時間を浪費していることがわかるかもしれません。XDebugを使用して、コードが起動して実行されたらプロファイルを作成します。不釣り合いな時間を消費しているコードのセグメントを探してから、リファクタリングします。includeとinclude_onceの間のパフォーマンスヒットに集中しすぎると、同期して実行されているcurlリクエストが朝食を食べているときに、ゴーストを追いかけることになります。
それまでの間、最良の提案はphp.netマニュアルを調べて、実行しようとしていることを実行する組み込み関数があるかどうかを確認することです。それを使用してください。PHPのCベースの拡張機能は、作成できるどのPHPコードよりも常に高速であり、実行しようとしていることの多くがすでに実行されていることに驚かれることでしょう。
しかし、繰り返しになりますが、これを十分に強調することはできません。時期尚早の最適化は悪いです!!! 十分なレベルの抽象化を使用してアプリケーションを立ち上げ、プロファイリングしてから、時間を浪費すると思われるものを修正するのではなく、実際に時間を浪費しているものを修正します。
厳密に言えば、サーバーはコードの解釈を行う必要がないため、ストレート HTML は常にサーバー側のアプローチよりも高速に機能します。
より大きな質問に答えるために、サイトが動かなくなる原因はいくつかあります。コードが PHP と比較して問題を引き起こしているときの特定のしきい値はありません。(Yahoo のサイトの多くは PHP 駆動型であるため、PHP はスケーリングできないと考えないでください)。
私が気づいたことの 1 つは、最も遅い PHP 駆動のサイトは、特定のページを表示するために必要以上のものを含んでいるものであるということです。OSCommerce (oscommerce.com) は、最も人気のある PHP 駆動のショッピング カートの 1 つです。ただし、すべてのコア機能 (必要な場合に備えて) をすべてのページに含めるという悪い習慣があります。したがって、「情報ボックス」を表示する必要がない場合でも、関数が読み込まれます。一方、「必要に応じてロードする」アプローチを取る PHP フレームワーク (CakePHP、Symfony、CodeIgniter など) は数多くあります。
私は次のことをお勧めします:
いや、インクルードは問題ありません。心配する必要はありません。
ある時点でキャッシュ ヘッダーを少し調整することを検討することもできますが、大きなヒットがない限り、問題にはなりません。これがすべて静的データであると仮定すると、サイト全体を静的 HTML に変換することを検討することもできます (最も簡単な方法: Web サーバー経由ですべてのページを取得し、一致するディレクトリ構造にダンプするスクリプトを記述します)。
ほとんどの Web アプリケーションは、データベースの速度 (または外部ストレージが何であれ、データベースの 9/10 倍) によって制限されており、アプリケーション コードが問題になることはめったにありません。あなたが心配する必要があることはまだやっています。
サイトのコードをどのように構造化するかについて長期的な決定を下す前に、Model-View-Controllerデザイン パターンを読んでおくことをお勧めします。他にもいくつかありますが、これは Web 開発界で大きな支持を得ているようで、しばらくの間存在するでしょう。どのような設計がニーズに最も適しているかについて最終的な決定を下す前に、Martin Fowler が彼のPatterns of Enterprise Application Architectureで提案した他の設計パターンをいくつか見てみるとよいでしょう。
プロジェクトのサイズと範囲に応じて、Zend Framework や PHP On Trax などの既製の PHP 用フレームワークを使用するか、独自のソリューションを構築することを決定できます。
特に HTML コンテンツのレンダリングに関しては、ビジネス ロジックを表示ロジックから分離するために、何らかの形式のテンプレートを使用することを強くお勧めします。私の開発におけるこの 1 つの単純なルールにより、どちらか一方を変更する必要があるときに、何時間もの作業時間を節約できることがわかりました。私は http://www.smarty.net/">Smarty を使用しました。そこにあるフレームワークのほとんどは、独自のテンプレート システムを持っているか、独自の好みを使用できるプラグイン アーキテクチャを提供していることを知っています。考えられる解決策を検討する際には、キャッシュされたバージョンを作成できるものを探すことをお勧めします。
最後に、バックエンドの速度が気になる場合は、バックエンド データ ストア (データベースであろうとシステム ファイルであろうと) の呼び出しを最小限に抑える方法を検討することを強くお勧めします。大量のコンテンツ (数百のレコードを含むテーブルに格納された大きなレポートなど) を一度に読み込んでレンダリングすることは避けてください。可能であれば、ユーザー インターフェイスが一度に読み込むデータのビットを小さくする方法を探してください。また、HTML コンテンツとその CSS、Javascript、またはその他の依存関係の実際の読み込み時間が特に気になる場合は、Yahoo! の担当者からのこれらの提案を確認することをお勧めします。
JayTee が言及したことを追加するには、必要なときに機能をロードします。これを自動的に行うフレームワークを使用していない場合は、PHP5 で導入された __autoload() 機能を調べることをお勧めします。基本的に、特定のクラスがまだインスタンス化されていない場合は、インスタンス化するときに独自のロジックを呼び出すことができます。読み込まれました。これにより、そのクラスをオンデマンドで定義するファイルを include() することができます。
アプリケーションを高速化するためにできる最大のことは、APCなどの Opcode キャッシュを使用することです。ウィキペディアには優れたリストと説明があります。
単純なインクルードに関する限り、ディスク I/O によってアプリケーションが適切にスケーリングされない可能性があるため、各リクエストに含まれるファイルが多すぎないように注意してください。数十個のインクルードでも問題ありませんが、通常は、最もよくインクルードするファイルを 1 つのスクリプトにパッケージ化して、インクルードを 1 つだけにすることをお勧めします。ロードする必要のないいくつかのクラスをあちこちに持つことによるメモリのコストは、何百もの小さなファイルを含めるためのディスク I/O のコストよりも優れています。