今天在使用 70google_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__);

typecho1typecho2typecho 共用 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_SEPARATORget_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__), '/');

即可。