今天在使用 70
的 google_code_svn
插件时,发现一个问题:
明明我的 vps 已经开启了 curl
,但是始终提示
对不起, 您的主机不支持 php-curl
扩展而且没有打开 allow_url_fopen
功能, 无法正常使用此功能
本地测试好着,放服务器上就出问题了。
开始一直以为是服务器问题,最后经过调试,确定了问题的根源!
var
文件夹位置的问题
typecho
默认的文件夹结构如下:如 /home/web/typecho
1└─typecho
2├─admin
3├─install
4├─usr
5├─var
6├─config.inc.php
7├─index.php
8└─nstall.php
如果一个 vps 上放多个 typecho
的话,完全可以共用 var
目录,这样,我把 var
目录放到 typecho
目录的同一级,即: /home/web/var
1├─var
2├─typecho_1
3├─typecho_2
4└─typecho
5├─admin
6├─install
7├─usr
8├─config.inc.php
9├─index.php
10└─nstall.php
修改 config.inc.php
里面的 var
的路径为 :
1@set_include_path(get_include_path() . PATH_SEPARATOR .
2 dirname(__TYPECHO_ROOT_DIR__) . DIRECTORY_SEPARATOR . 'var' . PATH_SEPARATOR .
3 __TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__);
让 typecho1
、typecho2
、typecho
共用 var
文件夹。
使用其它功能都没有任何问题,但是使用 GoogleCodeSVN 时出问题了。
var/Typecho/Common.php
类中,有一个 isAvailableClass
方法。
1/**
2* 判断类是否能被加载
3* 此函数会遍历所有的 include 目录, 所以会有一定的性能消耗, 但是不会很大
4* 可是我们依然建议你在必须检测一个类能否被加载时使用它, 它通常表现为以下两种情况
5* 1. 当需要被加载的类不存在时, 系统不会停止运行 (如果你不判断, 系统会因抛出严重错误而停止)
6* 2. 你需要知道哪些类无法被加载, 以提示使用者
7* 除了以上情况, 你无需关注那些类无法被加载, 因为当它们不存在时系统会自动停止并报错
8
9* @access public
10* @param string $className 类名
11* @param string $path 指定的路径名称
12* @return boolean
大约 466 行:
1$dirs = array_map('realpath', array_filter(explode(PATH_SEPARATOR, get_include_path()),array('Typecho_Common', '\_\_safePath')));
这句调用了 Typecho_Commmon::__safePath
这个方法,来检测类是不是能被加载。
__safePath
如下:
1/**
2* 检查是否为安全路径
3*
4* @access public
5* @param string $path 检查是否为安全路径
6* @return boolean
7*/
8public static function __safePath($path)
9{
10$safePath = rtrim(__TYPECHO_ROOT_DIR__, '/');
11return 0 === strpos($path, $safePath);
12}
也就是这个方法,设定了所有的类文件必须在 __TYPECHO_ROOT_DIR__
目录下,才可以加载。
而 var 文件夹已经明显没有在 typecho 目录下,因而返回 false。
解决方案:
如果像我一样,改了 var 目录的话,将 var/Typecho/Common.php
中 112 行(大概),__safePath
方法中的 $safePath
变量,改为 confing.inc.php
中 var
的上一级目录即可。
如我的 config.inc.php
中 var
的上一级目录:
1@set_include_path(get_include_path() . PATH_SEPARATOR .
2 dirname(__TYPECHO_ROOT_DIR__) . DIRECTORY_SEPARATOR . 'var' . PATH_SEPARATOR .
3 __TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__);
即 dirname(__TYPECHO_ROOT_DIR__)
将 var/Typecho/Common.php
中的
1$safePath = rtrim(__TYPECHO_ROOT_DIR__, '/');
改为:
1$safePath = rtrim(_dirname(__TYPECHO_ROOT_DIR__), '/');
即可。