3

引导您的 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';

请告诉我哪种方法更好。

在高负载应用程序的情况下,这将是最好的方法??

4

5 回答 5

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 中,所有应用程序的导入对于该应用程序来说应该是绝对的。

回复:高负载应用

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

于 2009-02-01T20:29:03.830 回答
3

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

所以我倾向于第一种方式,使用一个常量来保存应用程序根的绝对路径。

于 2009-02-01T20:58:28.183 回答
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()它会自动发生。

于 2009-02-01T21:05:45.410 回答
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/. 这一切都在网络根目录之上。它完全阻止用户访问这些文件,如果您将所有内容都放在文档根目录下,则必须采取预防措施。如果您的主机支持此功能(某些共享主机不支持),请利用它!

更新

在高负载应用程序的情况下,使用第二种方法是否很好?

在我看来,如果你要密切关注你的内容include_path(例如,在我的 Windows 开发机器上,我有各种我不需要的东西:SQL Server、Ruby 等)并且要去掉任何不需要的东西需要,那么第二种方法就可以了。

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

不过,真的。我认为这不会成为您系统性能的瓶颈。使用对您来说更容易的东西。

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

于 2009-02-01T21:06:18.417 回答
0

我更喜欢第二种方式——在一个大型 PHP 项目中使用它并且非常喜欢它。

于 2009-02-01T21:02:28.317 回答