3

PHP アプリケーションをブートストラップするのは良い習慣ですか。PHP アプリケーションをブートストラップする 2 つの方法を見つけました。より良い方法であるいくつかの提案が必要です。

初め。
フォルダー構造の定数を定義する

$controllerPath = 'controller';
define('CONTROLLER', str_replace('\\', '/', realpath($controllerPath)).'/');

//usage
require_once CONTROLLER . 'somecontroller.php';

次に
、ini_set を使用して、インクルード パスをアプリケーション ルートに設定します。

$rootPath = $_SERVER['DOCUMENT_ROOT'];
$includePath = ini_get('include_path');
ini_set('include_path', '.'.PATH_SEPARATOR.$rootPath.PATH_SEPARATOR.$includePath);

//usage
require_once 'controller/somecontroller.php';

どちらが良い方法か教えてください。

高負荷アプリケーションの場合、最適な方法はどれですか??

4

5 に答える 5

3

指定されたインクルード パスのいずれかで PHP にファイルを検索させるよりも、絶対パスを使用することをお勧めします。

そのため、アプリケーション ルートへの絶対パスを保持する定数を使用する最初の方法を使用する傾向があります。

于 2009-02-01T20:58:28.183 に答える
1

これが私のブートストラップローダーの例です:

if (!defined('APPLICATION_PATH')) {
    define('APPLICATION_PATH', realpath(getcwd() . '/../application'));
}

/**
 * Add the APPLICATION_PATH and the library dir to the include_path
 */
set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . PATH_SEPARATOR . realpath(APPLICATION_PATH . '/../library'));

/**
 * Load the file loader to setup the class autoloader
 */
include_once 'Loader.php';
if (!class_exists('Loader')) {
    die('Could not load class loader.');
}

spl_autoload_register('Loader::autoload');

私は個人的に2番目の方法で行きます。私は include_path が大好きであることを学びました。多くのディレクトリを調べるとパフォーマンスが低下する可能性がありますが、それが重要であるとは思えません。また、エラーがパス定数を含めるのを忘れるのを防ぎます。

余談ですが、コントローラなどを に入れ、/application/いくつかのライブラリを に入れました/library/。これはすべて、Web ルートの上に移動します。ユーザーがこれらのファイルにアクセスするのを完全に防ぎます。ドキュメント ルートの下にすべてがある場合は、予防策を講じる必要があります。ホストがこれをサポートしている場合 (一部の共有ホストはサポートしていません)、それを利用してください!

アップデート

高負荷のアプリケーションの場合、2 番目の方法を使用するのが良いですか??

私の意見では、あなたがあなたの中にあるものに目を光らせていればinclude_path(たとえば、私のWindows開発マシンには、必要のないあらゆる種類のものがあります:SQL Server、Rubyなど)、そうでないものはすべて取り除かなければなりません必要な場合は、2 番目の方法で問題ありません。

もう 1 つinclude_pathの方法は、スクリプトの最後に をダンプし、それを php.ini ファイルにハード コードすることです。

しかし、本当に。これがシステム パフォーマンスのボトルネックになるとは思いません。あなたにとってより簡単なものを使用してください。

実行しているサイトでパフォーマンスの問題がありますか、それともこれは予防的なものですか? 事前に最適化したい理由はわかりますが(自分でそれをやめなければなりません)、真剣に。それらの問題が発生したときに対処します。あなたが人気のあるサイトに対処してもらうという幸運な立場にあるとき. 一日の終わりに、いくつかrequireの s を交換しなければならない場合、それは悪夢ではありません。

于 2009-02-01T21:06:18.417 に答える
1

これが私がすることです:

  • すべてのクラス、ヘルパー関数などのために、/include ディレクトリをドキュメント ルート (または任意の名前) の先頭に配置します。
  • /include ディレクトリが mod_rewrite を使用して提供されないようにします。
  • 関連するiniパラメータ、パスなどを設定するsetup.phpという名前のファイルがあります。
  • そのファイルは、相対パスによってすべてのページに含まれています。と
  • 他のすべては、作成した設定に依存できます。

トップレベルの .htaccess の書き換えルールの例:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /include/
RewriteRule ^include/ - [R=404,L]

ちょっとずれてるかも。標準ルールが手元にありません。403 (Forbidden) ではなく、私が作成した 404 エラーであることに注意してください。それは意図的なものです。システムにログインすると、「不明なユーザー」や「パスワードが正しくありません」とは表示されません。/include ディレクトリがあると言うよりも、まったく存在しないふりをしたいのですが、それを見ることはできません。

その時点で、必要なすべてをセットアップできるので、残りのコードは次のように実行できます。

require 'Class.php';

または__autoload()自動的に発生するように定義することもできます。

于 2009-02-01T21:05:45.410 に答える
0

私は 2 番目の方法を好みます - 大規模な PHP プロジェクトで使用し、とても楽しんでいました。

于 2009-02-01T21:02:28.317 に答える