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