Какие каталоги проверяет PHP при включении относительного пути с include ()?

Это очень странно, кто-нибудь еще подводит итоги?

Иногда он также проверяет каталог включенного файла.

Но иногда нет.

D: \ Test \ 1.php

<?php include('sub\2.php'); 

D: \ Test \ 2.php

 <?php include('3.php'); 

Где 3.php находится в том же 2.php что и 2.php .

Вышеупомянутое работает, но почему? Текущий каталог должен быть D:\test , но он все равно может найти 3.php, который находится в D:\test\sub

Еще история ( окончательная )

Примерно год назад я встретил эту проблему, а затем я решил ее установить с помощью жесткого кодирования, как показано ниже:

common.php:

 if (file_exists("../../../Common/PHP/Config.inc")) include('../../../Common/PHP/Config.inc'); if (file_exists("../../Common/PHP/Config.inc")) include('../../Common/PHP/Config.inc'); if (file_exists("../Common/PHP/Config.inc")) include('../Common/PHP/Config.inc'); if (file_exists("Common/PHP/Config.inc")) include('Common/PHP/Config.inc'); в if (file_exists("../../../Common/PHP/Config.inc")) include('../../../Common/PHP/Config.inc'); if (file_exists("../../Common/PHP/Config.inc")) include('../../Common/PHP/Config.inc'); if (file_exists("../Common/PHP/Config.inc")) include('../Common/PHP/Config.inc'); if (file_exists("Common/PHP/Config.inc")) include('Common/PHP/Config.inc'); в if (file_exists("../../../Common/PHP/Config.inc")) include('../../../Common/PHP/Config.inc'); if (file_exists("../../Common/PHP/Config.inc")) include('../../Common/PHP/Config.inc'); if (file_exists("../Common/PHP/Config.inc")) include('../Common/PHP/Config.inc'); if (file_exists("Common/PHP/Config.inc")) include('Common/PHP/Config.inc'); 

Где Config.inc находится в том же каталоге, что и Common.php

Если вы посмотрите исходный код php в main / fopen_wrappers.c, вы найдете

 /* check in calling scripts' current working directory as a fall back case */ if (zend_is_executing(TSRMLS_C)) { char *exec_fname = zend_get_executed_filename(TSRMLS_C); int exec_fname_length = strlen(exec_fname); while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length])); if (exec_fname && exec_fname[0] != '[' && exec_fname_length > 0 && exec_fname_length + 1 + filename_length + 1 < MAXPATHLEN) { memcpy(trypath, exec_fname, exec_fname_length + 1); memcpy(trypath+exec_fname_length + 1, filename, filename_length+1); actual_path = trypath; 

Кажется, что это выполняется безоговорочно и поэтому всегда будет делать файл в том же ключе, что и доступный скрипт включения / открытия файла … как последний выбор после всех возможностей, указанных в include_path. И только если вы не определяете относительный или абсолютный путь в include ().

Он проверяет текущий путь и каталоги, перечисленные в include_path .

Вы можете запустить phpinfo() чтобы увидеть свой путь include.

Иногда каталог включенного файла является current working directory а иногда и не
Текущий каталог можно проверить с помощью getcwd()