2016-08-03 3 views
0

У меня есть любопытство. Что произойдет, если скрипт PHP включит себя?PHP self-including loop (концепция)

Причина, по которой я спрашиваю, что у меня есть php-файл, который генерирует содержимое для всех тегов <head> моего сайта. Это включает тег 404 error pagehead.

Если файл PHP, который генерирует эти head теги осуществляется непосредственно он «притворяется» не существует, включив 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.

Таким образом, чтобы подвести итог, если я прямо просить head.php от моего веб-браузера (не доступ к нему через php includes, только через запрос HTTP) он должен:

(а) понимают, что запрос не был include из другого файла PHP, то
(б) включают 404.php, который
(с) посылает 404 status на line 2 из 404.php и, затем,
(д) включает в себяhead.php.

Следовательно, в конечном итоге head.php будет включать в себя head.php.

такое случается?

+0

Я не был уверен, что это сработает, поэтому я публикую свои собственные результаты здесь, в стеке, чтобы все могли видеть. –

ответ

1

Да, это так.

ПРИМЕЧАНИЕ: Однако может возникнуть внутренняя ошибка сервера. Например:

include.php:

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

Этот скрипт производит внутреннюю ошибку сервера. Я не проверял, сколько раз файл может быть включен самостоятельно до возникновения ошибки, но, видимо, 10 раз (или больше) достаточно, чтобы вызвать ошибку.

Либо это, либо скрипт PHP не может напрямую включать себя. Он должен сделать это, включая отдельный скрипт, который включает в себя исходный скрипт

+0

Я не был уверен, что это сработает, поэтому я публикую свои собственные результаты здесь, в стеке, чтобы все могли видеть. –

Смежные вопросы