如何实现;编译时包括;在PHP中?

如何实现;编译时包括;在PHP中?,php,apache,webserver,compile-time,php-include,Php,Apache,Webserver,Compile Time,Php Include,PHP的和函数发生在运行时 考虑这个脚本page1.php: <?php require('bootstrap.php'); 这是你的错误假设 如果出现错误,则不必发送200或404,而是503 据说现代PHP版本必须处理好它,但我有一些报告说它没有。 我所知道的唯一有保证的方法是使用php fpm,因为在发生错误时发送503就是其中之一 无论如何,至少尝试在PHP设置(ini或perdir)中设置display\u errors=off,然后查看。应该没有错误消息(因为它应该在实时服务

PHP的和函数发生在运行时

考虑这个脚本page1.php:

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

这是你的错误假设

如果出现错误,则不必发送200或404,而是503

据说现代PHP版本必须处理好它,但我有一些报告说它没有。
我所知道的唯一有保证的方法是使用php fpm,因为在发生错误时发送503就是其中之一

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

如果您真的想这样做,那么使用URL重写来解决问题就更容易了。不要让main.php和所有其他脚本都包含bootstrap.php,只需要第三个脚本包含bootstrap.php和其他脚本

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

(注意:几个月后还没有出现正确的答案。)

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

可能会产生编译时包含的假象,但它们实际上跟踪每个包含文件的状态,并在运行时重新执行包含(如果文件已编辑)。这意味着,如果删除了包含的文件,或者该文件根本不存在,我们仍然会收到运行时错误/警告

但是,可以使用PHP来实现所需的,它用实际的文件内容替换所有include语句。只要包含的文件的名称不是动态字符串,并且可以静态确定,这就可以工作。(如果您的用例很简单,那么编写自定义预处理器并不太困难——例如,不使用etc)


如果只想在
include
语句失败时返回404页,那么请查找web服务器提供的选项。如果它不允许这样的配置,唯一的退路就是提供的URL重写解决方案。

看起来您试图以错误的方式解决此问题。你不能只
需要
项目引导文件中的文件吗?否则,我认为您可能需要查看自定义错误处理程序。引导文件是始终作为文件链中的第一项加载的文件。然后可以使用它加载所需的脚本和/或设置运行环境。基本上所有的请求都通过这个文件进行路由,然后它决定下一步加载什么其他文件。@PeeHaa,是的,我们都在谈论这个“引导文件”。无法保证文件系统上存在此引导文件。问题是我们如何在“编译时”中包含这个引导文件?@downvorters,如果你认为这个问题需要改进的话。。不评论反对票的人可能有一个很好的理由不这样做,因此这不是强制性的。因此,imho要求对否决票发表评论只是引入了噪音。好吧,我们是否应该返回404或503是有争议的。但这不是重点。。。。我们如何模拟PHP中的“编译时”包含?哦,不。这一点都没有争议。好吧,那么我们就不讨论它了。我们如何模拟PHP中的“编译时”包含?关于您的编辑,我想说我不认为您理解这个问题(见上文)。。。我不想告诉客户页面存在。我想告诉客户页面不存在。是的。这就是你做错的地方。仅当包含的文件包含数据而不是代码时,您可能需要404。但在后一种情况下,它根本不必是include(),这完全取决于您要完成的任务以及bootstrap.php丢失的原因。如果main.php是请求入口点,那么您的选项非常有限。另一种选择是将错误检查放入使用auto_prepend_file指令加载的文件中,但是您必须保证该文件始终存在。我不确定这是否是一种进步。