现在各种程序都有分卷备份。甚至还有帝国备份这种专门备份数据库的东西存在。像phpwind,discuz等都有分卷备份,甚至以16进制的方式进行备份再恢复以防止中文和特殊符号出错。你可以参考一下discuz

解决方案 »

  1.   

    方法很多
    1. 建个标记文件表示要restore了,然后crontab去读这个文件,调用batch,删除标记文件.
    2. 主程序用Ajax调用别的PHP去执行,给两个参数:从哪行读,读多少行.
    3. 和1差不多,调用外部程序,不必等返回值.
    ///////////////如果你非常BT地钟情于用纯PHP来处理////////////////
    4. hoge.php:
    <?php
    $start = $_GET['start_line'] || 0;
    settype($start,"integer");
    $game_over = false;
    /*
    从文件的$start行开始处理100条记录,
    到文件尾的话结束,设$game_over为true
    */
    if (!$game_over) {
      header("location:./hoge.php?start_line?start="+($start+100));
    } else {
      echo "Game Over.";
    }
    ?>5. 对4的改进,每次从$start行开始,要空读100行,越到后面效率越低.
    如果每一行的大小是确定的,
    那么直接算出文件偏移指针用fseek函数移动之.
      

  2.   

    十万行不是很多...直接一次完成吧每做完一定行数用 set_time_limit() 防止超时就可以了
    还可以用 ob_start() , ob_flush() 输出进度
    但要注意防止重复执行~影响效率
      

  3.   

    大文件操作可以考虑一下ftell, fseek 这些函数,操作超大文件都没有问题。
    比如你先读100行,ftell得到当前的位置并保存,然后处理。
    下次处理时,fseek到上次的位置,继续往下读。
    这样的方法非常高效,不会因为文件太大而影响效率。大文件操作慢主要慢在两个地方:
    1:全部读取,明显非常耗内存。
    2:遍历,比如读100行,丢弃,再读下一百行,依此类推。此法要遍历整个文件,也是很慢。fseek, ftell这种方法没有上述问题。
      

  4.   

    谢谢您的回答,您的第四种方法说:
    /*
    从文件的$start行开始处理100条记录,
    到文件尾的话结束,设$game_over为true
    */但不知道如何从$start行开始处理100条数据?
    如何文本当中有1000条数据的话,那么如何想得到第200-300条之间的数据,是不是还要先读取前100条数据?
      

  5.   

    至于怎么按行处理,可以参考linux tail的算法,几天前模拟了一个:http://bbs3.chinaunix.net/thread-1421500-1-1.html
      

  6.   


    如果指针位置此时等于10万的话,
    用fseek()定位也是很慢啊?
      

  7.   

    1fgets函数每次获取一行数据,所以需要读取100次.
    2不需要记录开始行,只需要记录上次结束的位置就可以了.
     上次结束的位置可以用ftell函数来获取.
    $findex = isset($_GET['findex']) ? $_GET['findex'] : 0;$fp = fopen('xxxx.sql', 'r');
    $i = 0;
    fseek($fp, $findex);
    while(!feof($fp) && $i++< 100)
    {
    $fdata = fgets($fp);
    $findex = ftell($fp);
    //echo $i . ":" .  $data . "<br/>";
    } //记录findex以便下次读取
      

  8.   

    谢谢了,还想请问一个问题,
    就是用txt备份数据库的话,一般的情况下每个文本存储的数量大小不超过多少KB为最好呢?
    如果超过了就分卷处理,谢谢了
      

  9.   

    用 BCP 先插到一个临时表里 之后在整理
    这样效率会高一些