Какие каталоги проверяет PHP при включении относительного пути с помощью include ()? - PullRequest
8 голосов
/ 13 марта 2010

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

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

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

D: \ тест \ 1.php

<?php

include('sub\2.php');

D: \ тест \ 2.php

<?php

include('3.php');

Где 3.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');

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

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

Если вы посмотрите на исходный код 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 ().

1 голос
/ 13 марта 2010

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

1 голос
/ 13 марта 2010

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

Вы можете запустить phpinfo(), чтобы увидеть ваш включаемый путь.

...