Нюансы использования подключаемых файлов с относительными путями

tvolf

Новичок
Нюансы использования подключаемых файлов с относительными путями

Всем привет.

Такой, возможно, чайниковый вопрос. Имеется следующая структура файлов и директорий сайта:
Код:
/-|
  | 
  index.php
  MyDir1 --|
           |
           MyDir2 --|
                    |
                    MyClass.php
                    Config.ini
то есть, в корне лежит index.php, а по пути /MyDir1/MyDir2 лежат 2 файла:
MyClass.php и Config.ini.
Содержимое index.php:
===
PHP:
<?php
    error_reporting(E_ALL | E_STRICT);
    set_include_path('MyDir1');
    require_once('MyDir2/MyClass.php');
    echo 'WorkDir1 = '. getcwd() . '<br>';        
    $ini_arr = MyClass :: parse('Config.ini');
    print_r($ini_arr);
===

Содержимое MyClass.php:


===
PHP:
<?php
    class MyClass {
        public static function parse($fname) {
            echo 'WorkDir2 = '. getcwd() . '<br>';                
            return parse_ini_file($fname);
        }
    }
===
Ну а Config.ini представляет обычный ini-файл.

В чем проблема. Если Config.ini лежит в /MyDir1/MyDir2, то скрипт index.php отрабатывает без ошибок, показывая содержимое Config.ini. Если же я переношу Config.ini в корень сайта, скрипт уже не работает, выдавая информацию о том, что файл Config.ini не найден (Warning: parse_ini_file(Config.ini) [function.parse-ini-file]: failed to open stream: No such file or directory in [..]\MyDir1\MyDir2\MyClass.php on line 5).
Если же я добавляю в include_path текущий каталог (set_include_path('.;MyDir1')), то Config.ini начинает уже нормально находиться и в корне сайта.
Подскажите, плиз, в чем может быть дело ? То есть, почему в первом случае, когда Config.ini лежит по пути MyDir1/MyDir2 он нормально отыскивается ? Ведь рабочим каталогом для обоих скриптов является именно корневой каталог, а каталог /MyDir1/MyDir2 в include_path даже не упоминается. Вообще, какова схема поиска файлов по относительным путям ? Не исключено просто, что я неправильно себе всё представляю :)
 

Фанат

oncle terrible
Команда форума
воспроизводится

-~{}~ 13.03.10 19:48:

на stackoverflow постанули вот этот кусок кода
Код:
/* 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;
я, правда, его не понял.
 

tvolf

Новичок
Нашел, вроде бы, полный текст функции php_resolve_path здесь. Там прямо перед тем фрагментом, что ты привел, есть цикл, где выполняется проход по всем переменным из include_path (передается как строчный параметр path в функцию), к каждому пути "приклеивается" имя файла и проверяется на возможность подлючения (существования по указанному пути ?). Ну а потом идет фрагмент, который ты привел ниже:

Код:
/* 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;
Здесь, судя по всему, определяется каталог текущего исполняемого скрипта (?) exec_fname
путем отсечения с конца всего до первого символа слэша, затем к нему "приклеивается" имя файла
filename, и полученная конструкция уже дальше проверяется на возможность подключения. Только что будет являться exec_fname в моем примере ? Index.php или MyClass.php ?
В общем, тоже не всё понятно, мягко говоря.
 
Сверху