如何在PHP中实现“编译时包含”?

时间:2013-07-13 15:15:27

标签: php apache webserver compile-time php-include

PHP的includerequire函数在运行时发生。

考虑这个脚本,page1.php:

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

如果bootstrap.php不存在,我们会收到运行时异常,例如: “500内部服务器错误”。

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

有没有办法在PHP中实现“编译时”包含?

3 个答案:

答案 0 :(得分:0)

这是你的错误假设。

如果出现错误但 503 ,则不得发送200或404。

据说现代PHP版本必须处理它,但我有一些报告说它没有 我所知道的唯一有保证的方法是使用php-fpm,因为发送503时出错是core features的一个。

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

答案 1 :(得分:0)

如果确实想要这样做,那么只使用网址重写来解决问题会更容易。而不是使main.php和所有其他脚本包括bootstrap.php,只需要第三个脚本包括bootstrap.php和其他脚本。

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

答案 2 :(得分:0)

(注:answering my own question作为正确的答案在几个月后没有出现。)

真正的编译时包含在&#34; native&#34;中不存在PHP因为PHP的本质是解释/运行时脚本语言。

PHP accelerators可能会给出编译时包含的错觉,但它们实际上会跟踪每个包含文件的状态,并在运行时重新编译包含文件。这意味着如果包含的文件被删除,或者它首先不存在,我们仍然会收到运行时错误/警告。

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

如果所有需要的是在include语句失败时返回404页面,则查找Web服务器提供的选项。如果它不允许这样的配置,那么唯一的后退就是由Peter's answer提供的URL重写解决方案。