准备将本地的数据库备份信息上传到服务器进行还原,结果卡在了
初始化完成的返回信息。
第一时间查看了ajax返回信息。
有两个请求,第一个是返回参数,第二个跳链出现了500的错误
根据请求地址找到了DatabaseController文件的import的方法
public function import($time = 0, $part = null, $start = null){
if(is_numeric($time) && is_null($part) && is_null($start)){ //初始化
//获取备份文件信息
$name = date('Ymd-His', $time) . '-*.sql*';
$path = realpath(C('DATA_BACKUP_PATH')) . DIRECTORY_SEPARATOR . $name;
$files = glob($path);
$list = array();
foreach($files as $name){
$basename = basename($name);
$match = sscanf($basename, '%4s%2s%2s-%2s%2s%2s-%d');
$gz = preg_match('/^\d{8,8}-\d{6,6}-\d+\.sql.gz$/', $basename);
$list[$match[6]] = array($match[6], $name, $gz);
}
ksort($list);
//检测文件正确性
$last = end($list);
if(count($list) === $last[0]){
session('backup_list', $list); //缓存备份列表
$this->success('初始化完成!', '', array('part' => 1, 'start' => 0));
} else {
$this->error('备份文件可能已经损坏,请检查!');
}
} elseif(is_numeric($part) && is_numeric($start)) {
$list = session('backup_list');
$db = new Database($list[$part], array(
'path' => realpath(C('DATA_BACKUP_PATH')) . DIRECTORY_SEPARATOR,
'compress' => $list[$part][2]));
$start = $db->import($start);
if(false === $start){
$this->error('还原数据出错!');
} elseif(0 === $start) { //下一卷
if(isset($list[++$part])){
$data = array('part' => $part, 'start' => 0);
$this->success("正在还原...#{$part}", '', $data);
} else {
session('backup_list', null);
$this->success('还原完成!');
}
} else {
$data = array('part' => $part, 'start' => $start[0]);
if($start[1]){
$rate = floor(100 * ($start[0] / $start[1]));
$this->success("正在还原...#{$part} ({$rate}%)", '', $data);
} else {
$data['gz'] = 1;
$this->success("正在还原...#{$part}", '', $data);
}
}
} else {
$this->error('参数错误!');
}
}
找到了第一个返回信息的地方
$this->success('初始化完成!', '', array('part' => 1, 'start' => 0));
按照这个方法的思路是获取到备份文件后,带着参数再请求自己一次,开始还原数据库的操作
所以,程序在还原数据库的判断里出错了
然后用exit;
找到了执行出错的地方
$start = $db->import($start);
再顺藤摸瓜找到这个方法,有没有出错的地方
路径:./ThinkPHP/Library/OT/Database.class.php
发现看不懂,于是搜了下百度,问题出在了一个用法上
if(false !== $db->query($sql)){
$start += strlen($sql);
} else {
return false;
}
将$db->query
改成$db->execute
后,再尝试一次还原操作,搞定,问题解决了。
那么query()和execute()到底有什么区别呢?
看到这里,对onethink这么写表示疑惑……