引导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';
请告诉我哪种方式更好。
如果是高负荷应用,那将是最好的方法??
答案 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)
这就是我的所作所为:
顶级.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项目中使用它并非常享受它。