2009-03-02 12 views
24

この質問は、Rasmus Lerdorf's talk from Drupalconを見ていることに由来します。この質問と彼の話は、Drupalとはまったく関係がありません。私自身の質問には、PHPとは何の関係もありません。それは私が興味がある一般的な単一のエントリポイントです。ウェブサイトへの単一のエントリーポイントを持つ。悪い?良い?問題ではない?

最近では、ほとんどのフレームワークは、あなたがそれらを使って構築したものに対して、単一のエントリポイントを提供するようです。彼の話では、Rasmusはこれが悪いと彼は考えていると言います。彼はこの考え方で正しいだろうと私には思われます。サイトに誰もが同じエントリーポイントで入ってくると、トラフィックが一定のポイントに達した後に何かがうまくいかないでしょうか?彼らの要求が同じポイントを通過することなく、サイト内の特定のポイントに直接アクセスできるようにする方が効率的ではないでしょうか?しかし、おそらく実際の影響はあまり悪くありませんか?多分現代建築はそれを扱うことができますか?おそらく考慮する価値がある前に、規模が本当に巨大でなければならないでしょうか?私はこのサイトの人々がこの問題についてどのように考えているのか不思議です。

答えて

29

、ラスマスや解釈は間違っています。

これは、コンピュータの仕組みの理解がはっきりとわからないことを示しています。より多くのものが使用されるほど、CPUに近い可能性が高いため、はより速くになります。単一のポイントof entry!=シングルポイントの障害。しかし、それはすべてのポイントの横にある、人々が単一のエントリポイントを言うとき、我々はアプリについて話している、それはあなたのロジックのエントリの単一のポイントです。

構造的に脳が壊れていても、中心点を持っていないか、一般的にはエントリポイントの数を減らしているわけではありません。エントリポイントごとにアプリ全体で1つのことをしたい場合は、変更する必要がある場所はいくつありますか?各ページがそれ自身の上に立っているアプリを扱ったので、変更する必要がありました。私はあなたにそれを必要としています。

+0

右の兄弟に。 Webサーバーは単一のエントリーポイントであると主張することができます。 Rasmusが提案するものはDRYではありません。すべてのスクリプトが同じリソースを個別にロードする必要があるからです。フロントコントローラーがそれを処理します。 – rick

+0

これは、私が主要なWebアプリケーションを複数エントリーからシングルエントリー/ FCに変換している理由です。より一貫性のある、メンテナンスの簡素化、集中管理されたキャッシュ、...本当に、唯一の(そしてマイナーな)欠点は、1つのエントリーポイントをボークするとサイトがダウンすることですが、それはうまくテストするインセンティブに過ぎません。 :-) –

4

ロードバランシングや宣言型コードなどの方法でスケーラビリティをサポートするWebフレームワークを使用することが重要です。

いいえ、1つのエントリポイントだけではボトルネックにはなりません。 Googleのトップページには多くのヒットがありますが、多くのサーバーがあります。

答えは次のとおりです。問題ではありません。

1

これは私が最初に考えたことですが、影響はないようです。結局のところ、あなたのエントリーポイントは、ブートストラップローダーを含むいくつかの環境定数を設定し、必要に応じてスローされた例外をキャッチし、フロントコントローラをディスパッチするという2つのことだけを(通常は)行います。私はだと思います。これは非効率的ではない理由は、コントローラ、アクション、さらにはユーザによってもこのファイルが変わらないからです。

私はこれが奇妙だと感じます。私は現時点では小さなMVCフレームワークを自分で構築していますが、使用したほとんどのフレームワークとは少し逆です。私は、アクセスされたファイルにコントローラロジックを置きます。たとえば、index.phpにはIndexControllerとそのアクションが含まれます。このアプローチは、少なくとも私にとってはうまくいきます。

2

私はあなたが1つのエントリポイントを持つこと以上の最大の利点の1つはセキュリティだと思います。入力されるすべての入力は、チェックされて単一の場所で検証された場合、システムを破壊する可能性が低くなります。

1

ほとんどのphp mvcフレームワークでは、何らかのURL書き換えが使用されているか、少なくともindex.phpの後にあるものを単独で解析するので、単一のエントリポイントはになります。です。そのほかに

、私はコンテキストごとのエントリポイントを提供したい、ウェブは(/せっけん)と言う/コンソール/ ...要するに

4

ソフトウェア開発のように、それは依存します。 Front-Controllerスタイルのフレームワークに対するRasmusの反対は、各リクエストで非常に多くのコードを前もって読み込むことから得られるパフォーマンスです。これは100%真です。ある種のスマートリソース読み込みモジュール/オブジェクト/ etcを使用している場合でも、フレームワークを使用することはパフォーマンスのトレードオフです。あなたはパフォーマンスヒットを取るが、お返しにあなたが戻って

  1. (つまり、何でも)、「ビジネスロジック」とテンプレート/レイアウトロジックの奨励別離

  2. インスタントと(さらに重要なこと)統一を取得しますデータベース照会、呼び出されたサービス、データモデルなどに使用するオブジェクトへのアクセス

Rasmusのような人にとっては、これはパフォーマンスのヒットに値するものではありません。彼はC/C++プログラマーです。彼にとって、ビジネスロジックを高いパフォーマンスで分離するには、PHPにC/C++ Extensionを書きます。

PHPにC/C++拡張機能を簡単に書き込むことができる環境とチームがあり、市場投入時間とパフォーマンスの比が許容範囲内であれば、はい、フロントコントローラーフレームワークを放棄してください。

あなたの環境ではない場合は、フロントコントローラフレームワークが生産性を向上させることを考慮して、(likely) simple CRUD Applicationに持ち込むことができます。

1

追加するだけで、人々は通常考えていることは、1つのPHPページがあるため、すべてのリクエストに対応する単一のページです。並べ替えのような並べ替え。

注意すべき重要な点は、各リクエストがスクリプトのインスタンスを作成するため、2つの異なるページが同時にアクセスされた場合と同じです。だから、まだ同じ負荷。事実上

しかし、一部のフレームワークでは、入力スクリプトでは不要なものがたくさんあるかもしれません。すべての可能なシナリオを満たすためのキャッチオールのような並べ替えは、負荷の原因となる可能性があります。

個人的には、私は複数のページを好む、私はoopと手続き型を混ぜるのと同じ方法です。私は古い学校の方法のPHPが好きです。

0

フロントコントローラのファイルアーキテクチャには明らかに欠点があります。 Saemが説明しているように、同じファイルにアクセスすることは一般的にパフォーマンスにとっては有利ですが、Alan StormとRasmus Lerdorfが説明しているように、コードはさまざまな状況を処理しようとします(フロントコントローラはサイトのすべての "ページ" )コードの肥大化した複雑なコレクションにつながります。すべてのページの読み込みに膨大で複雑なコードのコレクションを使用することは悪い習慣とみなすことができます。

Saemは、フロントコントローラが複数の場所でコードを編集しなくても済むと主張していますが、冗長性を分離することで解決できる場合もあります。

Webサーバーで実際に使用されるディレクトリ構造を使用すると、Webサーバーにとって簡単になり、開発者にとってはより明確になります。 Webサーバーは、URLを新しいURLに書き換えるよりも伝統的に表現しているように、URLに変換してファイルを提供するほうが簡単です。フロントコントローラー以外のファイルアーキテクチャは、開発者にとってより明白になります。なぜなら、すべてを処理するために膨らんだコントローラーから始めるのではなく、開発する必要のあるファイル/コントローラーから始めるからです。

2

「1つのファイル」と「複数のファイル」の点からこれについて議論するのは大きな誤解だと思います。

エントリポイントが単一のファイルであるため、私たちが集中しなければならないのは、その1つのファイル内のコードだと思う傾向があります。間違っています。

すべての一般的なフレームワークには、エントリ操作コード、解釈コード、および要求の検証コードを含むたくさんのファイルがあります。コードは1つの場所に配置されているのではなく、要求されているものとその方法に応じて異なるクラスを呼び出すrequire/includeステートメントのジャングルに広がっています。

どちらの場合も、要求は実際には異なるファイルによって処理されます。

なぜ、strpos()、substr()、strncmp()などのいくつかの他の関数を呼び出す必要がある何らかの_detect_uri()関数を使用して単一のエントリポイントを作成する必要があります。私はちょうどすべてのコードを削除するいくつかのエントリポイントを使用することができます要求文字列?

URI.phpのCodeIgniters _detect_uri()関数を見てください。 CodeIgniterを選択するのではなく、単なる例です。他のフレームワークも同様です。

MVCパターンの目的は、1つのエントリポイントだけでなく、複数のエントリポイントでも達成できます。

関連する問題