Это очень нечетно, имеет кого-либо, когда-нибудь подводят итог с заключением уже?
Иногда это проверяет каталог включенного файла, также.
Но иногда нет.
D:\test\1.php
<?php
include('sub\2.php');
D:\test\2.php
<?php
include('3.php');
Где 3.php
находится в том же dir как 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
Если вы посмотрите на исходный код 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 ()
, чтобы увидеть свой путь включения.
Иногда каталог включаемого файла является текущим рабочим каталогом
, а иногда нет
Текущий каталог можно проверить с getcwd ()