哪个更好:require_once?或者if(!defined('FOOBAR'))是否需要?还是完全不同的东西?

时间:2009-06-03 12:49:59

标签: php

假设PHP版本> = 5.2,这是一个更好的管理解决方案包括:

require_once DEFPATH . 'config.inc.php';

if (!defined('FOOBAR')) require DEFPATH . 'config.inc.php';

还是完全不同的东西?

网站不使用前端控制器或自动加载器。需要包含的典型文件数为3 - 8。

在这里和其他地方,我听说require_once增加了开销,并且不适合缓存。但我也听说在PHP的更高版本中,少数require_once语句在实践中是可以的。

检查某些内容是否已定义时,还必须存在一些开销,但这可能不是问题。

一般来说,这是更好的做法,为什么?

3 个答案:

答案 0 :(得分:3)

是的,require_once()带有CPU和内存开销,但对性能没有任何重要意义。实际上,这是一个非常有效的操作,因为PHP只进行一次哈希表查找以确定该文件是否已被解析。不要像你的!定义('FOOBAR')这样的黑客给自己带来任何不必要的麻烦,因为它只会以较不优雅的方式做同样的事情。

PHP请求期间需要花费时间的是文件路径查找,然后是后续解析步骤。运行时确定您之前是否已经解析过文件所需的资源量可以忽略不计。

您可以采取一些措施让您的请求更快地运行:

  • 避免在include()和require()
  • 中使用不必要的长搜索路径
  • 使用绝对包含路径
  • 仅在需要时包含内容
  • 缓存大量输出片段
  • 缓存复杂查询结果
  • 编写简洁代码,将很少使用的功能卸载到按需提供的源文件

如果您正在使用代码缓存或某种运行时优化器,请阅读手册 - 它们有不同的策略,实际上可能会影响性能或根据您的代码引入错误。

最后一条建议:提防过早优化!服务器上的0到50毫秒之间的请求在用户方面几乎无法区分。

答案 1 :(得分:2)

我会在你的情况下使用require_once。即使它增加了开销,也可以忽略它,特别是当你只需要包含最多8个文件时。 require_once不易出错,更“干净”......

答案 2 :(得分:0)

在您的示例中,检查是否定义了FOOBAR会更好。但那是因为您的示例未指定包含文件的完整路径。

除非您特别想使用相对路径,否则应始终指定几乎所有内容的完整路径。否则,PHP需要在各种搜索路径目录中搜索您的文件。如果碰巧在最后一个搜索路径目录中,那就有点开销。

我总是创建一个包含我从中加载文件的目录的完整路径的数组,然后我会在我正在加载的文件前面添加相应的路径。