Это очень странно, кто-нибудь еще подводит итоги?
Иногда он также проверяет каталог включенного файла.
Но иногда нет.
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()