onethink - 还原数据库功能卡住没反应

准备将本地的数据库备份信息上传到服务器进行还原,结果卡在了
初始化完成的返回信息。

第一时间查看了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这么写表示疑惑……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值