本帖最后由 vinsonwang 于 2011-6-29 18:14 编辑
UCenter 进行备份时,经常会遇到这个问题: 备份提示:无法访问到该应用的备份接口,请拷贝 UCenter 根目录下 api/dbbak.php 到该应用的 api 目录下。 下面就分析一下在UCenter后台备份的流程。不太理解代码的朋友,可以跟着步骤看一看。 当我们点击提交的时候,URL链接为uc_server/admin.php?m=db&a=operate&t=export&appid=0&backupdir=backup_110629_W1hDIc,
admin.php脚本中的代码:
- if($app['type'] == 'DISCUZX') {
复制代码 告诉我们,下一步执行的脚本为control目录下的admin/db.php,a=operate,则调用db.php脚本里的onoperate()函数。这个onoperate()函数就是备份的函数。
下面我们来看看onoperate()函数里有一小句代码:db_back_api_url_invalid 这句话我们可以在message.lang.php语言包里找到,它就是文字“无法访问到该应用的备份接口,请拷贝 UCenter 根目录下 api/dbbak.php 到该应用的 api 目录下”。
那么,在db_back_api_url_invalid 这句话出现之前,执行了什么,或者说是什么条件下,才报错了呢?我们看到它是出现在if(empty($res))后面,也就是说$res为空的时候,就出现错误了。我们再继续看$res这个变量哪里来的。
- $res = $_ENV['misc']->dfopen2($url, 0, '', '', 1, $app['ip'], 20, TRUE);
复制代码 $res 也就是 $_ENV['misc']->dfopen2($url, 0, '', '', 1, $app['ip'], 20, TRUE)执行后的结果, $_ENV['misc']->dfopen2的意思是执行misc.php文件中的dfopen2这个函数,而dfopen2有调用dfopen函数,我们看看misc.php脚本中的dfopen函数。
在dfopen函数里有一句:$matches = parse_url($url); 这里的$url即为$app['url'].'/api/db/dbbak.php?apptype='.$app['type'],我们终于见到了api/dbbak.php这个熟悉的字眼儿。我们接着往下看,
- $matches = parse_url($url);
- $host = $matches['host'];
- $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
- $port = !empty($matches['port']) ? $matches['port'] : 80;
复制代码 首先是对URL进行parse_url分解并赋值给matches 数组,包括主机名,路径,方法等。再下一步就是对fsockopen的结果做出判断,如果失败,则返回一个'' ,即“空“。为空,则上一步的$res也就空,所以我们就看到了报错。那么,为什么fsockopen或
pfsockopen失败了呢,第一种解释,那个url根本不存在,这样当然会报错,按照提示我们把文件放过去就可以了,还有一种可能,就是安装端口非80端口,那这时就要这么操作:
找到model/misc.php 把其中的 $out .= "Host: $host\r\n";
改成$out .= "Host: $host: $port\r\n";
|