当脚本从命令行运行时,sp​​l_autoload失败

问题描述:

我知道这与路径不太正确有关,但让我感到莫名其妙。我也没有任何问题,在所有的浏览器中运行我的脚本,但是当我做的完全一样的出发点壳,spl_autoload抱怨和模具:当脚本从命令行运行时,sp​​l_autoload失败

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

我使用从根目录的绝对路径,回荡屏幕并将其粘贴到一个外壳中,并证实它是好的。请...我错过了什么?

+0

你能否提供一个失败代码的相关代码片段? – salathe 2010-01-02 15:18:42

+0

从命令行运行'php -i'并检查它是否与web服务器使用相同的'php.ini'。 – 2010-01-24 14:54:05

+0

也尝试以root身份从shell运行该脚本(如果它不是太冒险)。如果它有效,那么它可能是一个权限问题。 – 2010-02-05 10:11:04

尝试使用__DIR__常量来查找文件,CLI PHP不使用相同的工作目录。

使用这样的事情:

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

Alix,感谢您的帮助。我从来没有使用__DIR__常量,并尝试回显结果,但只返回'__DIR__。我用echo $ _SERVER ['SCRIPT_FILENAME'];相反,它给了我脚本所在的确切路径。这是你想看到的吗? – jim 2010-01-02 15:39:50

+0

'__DIR__'仅在PHP 5.3.0以后才可用,请改用'dirname(__ FILE __)'。 – 2010-01-02 16:17:20

通常可以抢了该项目的根目录中的线沿线的东西:

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

一旦你有你的根路径,你可以修改包含路径,使用set_include_path。 (记得包括get_include_path,否则你将失去默认值)

一旦这样排序,只需设置你的自动加载器假设根目录,你应该没问题,因为它比依靠相对更具体一些可以根据工作目录改变的路径。