2009-08-16 3 views
2

странная проблема с php на windows ... мое приложение загружает файл «core», который загружает файл настроек, регистрирует автозагрузки, выполняет инициализацию и т. Д. В верхней части основного файла, у меня есть include_once («config.php «); это отлично работает для чего-либо в текущем каталоге, если я включаю основной файл из отдельного каталога, хотя он просто молча игнорирует включение конфигурационного файла ... кто-нибудь видел это раньше?require_once ignored

/webroot/core.php

<?php 
    require_once "config.php"; 
    //register autoloads 
    //do some initialization... standard stuff 
?> 

/webroot/config.php

<?php 
    define("WEB_ROOT","/webroot"); 
    define("DB_USER","root"); 
    // ... more stuff... 
?> 

/webroot/admin/index.php

<?php 
    require_once("../dbconnect.php"); 
    echo WEB_ROOT; 
    // print string literal WEB_ROOT rather than value in config.php 
?> 

Я понимаю, что файл операции относятся к каталогу файла, делающего запрос, не должен require_once («config.php») выбрать файл re lative to core.php? Этот код работает так же, как я ожидал бы на Mac или Linux, но не на всех окнах (если я изменю требование использовать полный путь или ../, он работает)

Настоящим безумием является то, что require_once («config.php») не вызывает никаких ошибок, но ни один из кода внутри не выполняется!

+0

еще кто-нибудь заметил, что index.php загружается dbconnect.php вместо config.php или core.php? Вам также нужно показать содержимое dbconnect.php ... –

ответ

7

Если PHP молча игнорировать ошибки, попробуйте поставить в верхней части файла, запрошенный:

ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

Теперь все ошибки должны быть видны.

Тогда наилучшая практика (по мне) заключается в том, что в запрошенном файле (не в любом из включенных файлов) определите константу с полным путем файловой системы для корня приложения. Таким образом, в index.php если корневая приложение /webroot/admin:

define('APP_DIR', dirname(__FILE__)); 

После этого, когда вы включаете что-то использовать эту константу. Если структура каталогов:

/webroot/ 
    admin/ 
     index.php 
    config.php 
    core.php 

И вы хотите включить в config.phpindex.php:

require_once APP_DIR . '/../config.php'; 

В core.php включить config.php было бы:

require_once APP_DIR . '/../config.php'; 

И так далее.

Использование абсолютных путей файловой системы предотвратит любые неоднозначности.

+0

с использованием dirname (__ FILE__) - отличный способ определить абсолютный путь! К сожалению, приложение, над которым я работаю, устанавливает это вручную в файле конфигурации, а затем использует это как «APP_DIR». Я действительно не знаю, почему! – Michael

1

Возможно, вы используете ограничение PHP open_basedir? Чтобы попытаться предотвратить некоторые вредоносные сценарии, PHP имеет «безопасный режим», который, среди прочего, ограничивает загрузку файлов. Если бы xampp включил его по умолчанию, вы могли бы столкнуться с ним.

Возможно, вы также захотите проверить журналы ошибок вашего веб-сервера, чтобы увидеть, есть ли там какие-либо признаки отказа (и включить отчет об ошибках, желательно до E_ALL, до тех пор, пока вы не отсортируете вопрос).

+0

Я проверил ini, чтобы проверить, включен ли safemode, это не тот случай, но большое предложение! Сообщения об ошибках было установлено просто игнорировать уведомления, но с ванильным E_ALL я просто получить это: Примечание: Использование неопределенной константы FILE_ROOT - предполагается «FILE_ROOT» в C: \ Webroot \ core.php на линии 87 даже не в выгруженном файле конфигурации появляется уведомление! – Michael

2

Если вы хотите включить файл, используя путь относительно файла делает включение, вы должны предварять полный путь, например:

<?php 
require_once(dirname(__FILE__) . "/config.php"); 
?> 
+1

не на nixes ... его так странно, что php просто молча игнорирует требование в этом случае! – Michael

+0

Эта строка на самом деле из моего сценария, который я разработал специально для Linux. Молчаливый игнорирующий бит действительно странный, и я не могу помочь вам в этом, я боюсь. Я только что опубликовал то, что я адаптировал в качестве лучшей практики несколько лет назад. – Thorarin