2010-01-02 2 views
3

Я знаю, что это связано с тем, что путь не совсем прав, но он меня озадачил. Я могу запустить мой сценарий без каких-либо проблем на всех из браузера, но когда я на то же место из оболочки, spl_autoload жалуется и умирает:spl_autoload терпит неудачу, когда сценарий запускается из командной строки

Fatal error: spl_autoload(): Class db could not be loaded in...

Я использую абсолютный путь из корневого каталога, вторит скринировать и вставлять его в оболочку и проверять, что это хорошо. Пожалуйста ... что мне не хватает?

+0

Не могли бы вы предоставить соответствующий фрагмент кода, который не работает? – salathe

+0

Запустите 'php -i' из командной строки и проверьте, использует ли он тот же' php.ini', что и веб-сервер –

+0

, и попробуйте запустить этот скрипт как root из оболочки (если это не слишком рискованно). Если он работает, это может быть проблемой разрешения. –

ответ

2

Попробуйте использовать константу __DIR__, чтобы найти файлы, CLI PHP не использует один и тот же рабочий каталог.

использовать что-то вроде этого:

function __autoload($class) 
{ 
    require_once(dirname(__FILE__) . '/path/to/libraries/' . $class . '.php'); 
} 
+0

Аликс, спасибо за помощь. Я никогда не использовал константу __DIR__ и пытался повторить результат, но только вернул '__DIR__. Я использовал echo $ _SERVER ['SCRIPT_FILENAME']; вместо этого он дал мне точный путь, где находится мой сценарий. Это то, что вы хотели видеть? – jim

+0

'__DIR__' доступен только с PHP 5.3.0, вместо этого используйте' dirname (__ FILE __) '. –

0

обычно вы можете захватить ваш корневой каталог для проекта с чем-то вдоль линий:

// The file that defines this is 2 directories below root, hence the ../ changes. 
define('PATH_ROOT', realpath(dirname(__FILE__) . '/../../')); 

После того, как у вас есть корневой путь, который вы можете изменить ваш include path, используя set_include_path. (не забудьте включить get_include_path, когда вы его установили, иначе вы потеряете значения по умолчанию)

После того, как это отсортировано, просто настройте свой автозагрузчик в предположении против корневого каталога, и вы должны быть в порядке, так как он немного конкретнее, чем полагаться на относительные пути, которые могут меняться в зависимости от рабочего каталога.

Смежные вопросы