PHP Bootstrapping更好的方法?

时间:2009-02-01 20:23:07

标签: php bootstrapping

引导PHP应用程序是一个好习惯。 我发现了两种引导PHP应用程序的方法。需要一些更好的方法。

首先
为文件夹结构定义常量

$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';

请告诉我哪种方式更好。

如果是高负荷应用,那将是最好的方法??

5 个答案:

答案 0 :(得分:4)

使用ini_set将其设置为您的应用程序的目录。这就是为什么你可以在require语句中使用文字字符串。此外,它使重用代码更容易使用

require 'coolapp/class/Model.php'
require 'coolapp/display/Router.php'
require 'spinoff/display/JsView.php'
// etc

它类似于java中具有完全限定导入com.whatever.app.more的想法,或者在python中所有应用程序导入的方式应该是相对于该应用程序的绝对值。

Re:高负载应用

除非您要加载数千个文件,否则包含文件所需的时间可能不是瓶颈。但是,如果是这种情况,你有几个选择。一个是APC,它将include的结果缓存在内存中。另一种方法是从单个文件加载所有内容,类似于将javascript文件连接成一个文件以获得更好的性能(巧合的是,APC具有为您提供此信息的功能)。 APC非常容易设置并且完全透明,可以提升~50% better performance

答案 1 :(得分:3)

最好使用绝对路径,而不是让PHP在给定的包含路径之一中找到文件。

所以我倾向于使用一个常量来保持应用程序根目录的绝对路径。

答案 2 :(得分:1)

这就是我的所作所为:

  • 将/ include目录放在文档根目录的顶部(或任何你想要调用的目录),用于所有类,辅助函数等;
  • 使用mod_rewrite;
  • 使其无法提供/ include目录
  • 在那里有一个名为setup.php的文件,它设置了相关的ini参数,路径等;
  • 该文件按相对路径包含在每个页面中;和
  • 其他所有内容都可以依赖于它创建的设置。

顶级.htaccess的重写规则示例:

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

我可能会稍微偏离。我没有方便的标准规则。你会注意到我创建的是404错误,而不是403(禁止)。这是故意的。当您登录系统时,它不会说“未知用户”或“密码不正确”,因为这会告诉您一些事情。我宁愿假装根本没有/ include目录,而不是说它在那里,但你不能看它。

此时您可以设置所需的所有内容,以便其余代码可以执行:

require 'Class.php';

甚至定义__autoload(),以便自动发生。

答案 3 :(得分: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');

我个人会采用第二种方式。我已经学会了喜欢include_path:在查看大量目录时可能会有一些性能损失,但我怀疑它会很重要。它还可以防止错误忘记包含路径常量。

在旁注上我将我的控制器等放在/application/中,并在/library/中有一些库。这一切都超越了Web根目录。它完全阻止用户访问这些文件,如果您拥有文档根目录下的所有内容,则必须采取预防措施。如果您的主机支持此功能(某些共享主机不支持),请利用它!

更新

  

如果是高负载应用,那么使用第二种方法是好的吗?

在我看来,如果你要留意include_path中的内容(例如,在我的Windows开发机器上,我在那里有各种我不需要的东西:SQL Server,Ruby等。并且要去掉任何不需要的东西,然后第二种方法就可以了。

您可以做的另一件事是将include_path转储到脚本末尾并将其硬编码到php.ini文件中。

但是真的。我认为这不会成为系统性能的瓶颈。使用对你来说更容易。

您在运行的网站上是否存在性能问题,或者这是预防措施?我明白为什么你要预先优化(我必须阻止自己这样做),但要认真对待。出现时处理这些问题。当你处于一个受欢迎的网站处理它的幸运位置时。在一天结束时,如果你必须更换几个require,这不是一场噩梦。

答案 4 :(得分:0)

我更喜欢第二种方式 - 在大型PHP项目中使用它并非常享受它。