PHP 自包含循环(概念)


PHP self-including loop (concept)

我很好奇。如果 PHP 脚本包含自身会发生什么?

问的原因是我有一个 php 文件,可以为我网站的所有<head>标签生成内容。这包括该网站的404 error page head标签。

如果直接访问生成这些head标签的 php 文件,则通过包含404 error page来"假装"不存在,这会将404 status发送回客户端。

文件系统如下所示:

/
  .htaccess <- (apache 404 handling)
  404.php <- 404 error page
  head.php <- '<head>' generator
  ...

404.php包含:

<?php
    header("HTTP/1.0 404 Not Found");
?>
<html>
    <head>
<?php
    $key = true;
    include dirname(__FILE__) . "/head.php";
?>
    </head>
    <body>
        lul. dead.
    </body>
</html>

head.php包含:

<?php
    if(isset($key) && $key===true){
        //code to generate <head> content
    }else{
        include dirname(__FILE__) . "/404.php";
    }
?>

$key告诉head.php它被另一个php文件包含在内,而不是通过URL请求的。

因此,总而言之

,如果我直接从我的 Web 浏览器请求head.php(不是通过 php includes 访问它,只是通过 http 请求(,它应该:

(a(意识到请求不是来自另一个PHP文件的include,然后
(b(包含404.php,其中
(c(line 2 404.php上发送404 status,然后(
d(包括head.php

因此,最终head.php将包括head.php .

会这样吗?

是的,确实如此。

注意:但是,可能会发生内部服务器错误。例如:

include.php

<?php
    if(!isset($s)){
        $s = 0;
    }
    if($s<10){
        include "include.php";
        $s++;
    }
?>
test

此脚本生成内部服务器错误。我没有检查在错误发生之前可以自行包含多少次文件,但显然 10 次(或超过(足以导致错误。

无论是那个还是 PHP 脚本都不能直接包含自身。它必须通过包含一个包含原始脚本的单独脚本来做到这一点