-3

PHPincluderequire函数发生在运行时。

考虑这个脚本 page1.php:

<?php
require('bootstrap.php');

如果 bootstrap.php 不存在,我们会得到一个运行时异常,例如“500 Internal Server Error”。

我们如何将 bootstrap.php 包含page1.php 中,以便将它们视为一个单元,而不是在运行时混合在一起的两个独立单元?

有什么方法可以在 PHP 中实现“编译时”包含?

4

3 回答 3

0

这是你的错误假设。

如果发生错误,则不必发送 200 和 404 ,而是发送503

据说现代 PHP 版本必须处理它,但我有一些报告说它没有。
我知道的唯一有保证的方法是使用 php-fpm,因为在出​​错的情况下发送 503 是它的核心功能之一。

无论如何,至少尝试 display_errors = off在 PHP 设置(ini 或 perdir)中进行设置并查看。应该没有错误消息(因为它应该在实时服务器上),但 5xx 状态会告诉客户端页面存在但遇到临时问题。

于 2013-07-13T15:18:29.003 回答
0

如果您真的想这样做,那么使用 URL 重写来反转问题会更容易。而不是制作 main.php 和所有其他脚本包括 bootstrap.php,只需要第三个脚本包括 bootstrap.php 和其他脚本。

您可以保留现有 URL 并使用重写规则通过此中央脚本将所有请求路由到受影响的文件。该脚本将对 bootstrap.php 进行包含/错误检查,然后发送 404 响应或根据请求 URI 找出原始脚本路径并将其包含在内。这将允许您在一个地方进行所有自定义错误处理。

于 2013-07-13T17:31:55.247 回答
0

(注意:几个月后没有出现正确回答我自己的问题。)

“本机” PHP 中不存在真正的编译时包含,因为 PHP 的本质是一种解释/运行时脚本语言。

PHP 加速器可能会产生编译时包含的错觉,但它们实际上会跟踪每个包含文件的状态,并在文件被编辑时在运行时重做包含。这意味着如果包含的文件被删除,或者它甚至根本不存在,我们仍然会收到运行时错误/警告。

但是,可以使用 PHP预处理器来完成所需的操作,该预处理器将所有包含语句替换为它们的实际文件内容。只要包含文件的名称不是动态字符串并且可以静态确定,这将起作用。(如果您的用例很简单,编写自定义预处理器并不难——例如不使用命名空间等)。

如果只想在语句失败时返回 404 页面include,那么请寻找 Web 服务器提供的选项。如果它不允许这样的配置,唯一的后备将是彼得的回答提供的 URL 重写解决方案。

于 2014-10-29T16:55:59.553 回答