3

这已经在我脑海中萦绕了很长一段时间,我想我应该寻求专家的答案。我想知道通过单个文件汇集所有 PHP 请求是否是一种糟糕的编程技术。我一直在开发一个网站,但不确定它是否会随着增长而扩展,因为我不能 100% 确定 PHP 如何处理该include()功能。

为了更好地解释我是如何构建我的准框架的,这里是我的根.htaccess文件的一个片段:

# > Standard Settings
RewriteEngine On

# Ignore all media requests
RewriteRule ^media/ - [L]

# Funnel all requests into model
RewriteRule ^(.*)$ _model.php [QSA]

所以除了媒体目录中的内容之外的所有内容都被传递到这个单一的脚本中。

在里面_model.php我有我所有的输入清理、用户身份验证、从数据库中提取会话数据、设置任何全局变量(常用变量,如 $longTime、$longIP 等)。通过解释$_SERVER["REQUEST_URI"]变量来路由请求。

本质上,我有一个switch()选择要使用哪个模块的语句include()。我不明白的是:当PHP执行时,include()无论case指令是否为真,它都会执行每一个吗?

我担心以后我会有很多这些模块 - 如果 PHP 在运行时包含所有模块,它最终会占用太多的处理能力和 RAM ......

--

编辑:
我真的只是在问 PHP 是否会“读取”它可能必须包含的所有文件。我知道它实际上不应该执行代码。如果我的其中一个include()是一个需要很长时间处理的 2GB 文件,PHP 是否总是在执行之前读取该文件?

-- 编辑:
我发现了另一个类似的问题(在发布这个问题之前我做了很多搜索) PHP 的 include/require 条件内的行为

我想我可以关闭它。

4

2 回答 2

2

不,PHP 将在到达代码片段的那一刻执行包含。

这一点非常重要,因为您可以直接让 php 包含文件和代码。例如

文件1:

<?php echo "Foo"; ?>

文件2:

<?php
  echo "Before";
  include("File1");
  echo "After";
?>

有时您的 PHP 处理器甚至在编译时都不知道要包含哪个文件。想象一下类似的东西include("File".mt_rand(1,10));。PHP 在到达 include 语句之前都不知道要包含的文件名。

于 2013-02-06T10:52:33.610 回答
2

即使条件不满足,PHP 会包含该文件吗?

不,includeandrequire语句的解释和评估方式与其他 PHP 语句相同。PHP 不会在执行之前扫描脚本以查找包含项。

这可以通过一个简单的测试来验证:

if(false)
{
    include('does_not_exist.php');
}

以上不会产生错误或警告。如果在执行之前读取了包含,您会看到如下警告:

警告:包括(does_not_exist.php):无法打开流:没有这样的文件或目录...

警告:include():未能打开“does_not_exist.php”以包含...

于 2013-02-06T10:55:01.380 回答