首页 > 编程 > PHP > 正文

PHP利用fseek函数操作大文件

2020-03-22 18:03:50
字体:
来源:转载
供稿:网友
  • 最近又遇到一个难緾的客户,明明在网站后台已经给他们做了一个积分导入模块,他们嫌手工导入麻烦,非要做个自动化的,而且要两套方案、

    方案1:他们开放一个内部数据库,由我们读取数据并写到新数据库里。他们领导说不安全,但是还是让做,作为备用方案。

    方案2:他们将数据定时导出成TXT文本格式,放在一个指定的路径,我们定时读取它并解析。由于数据量很大,至少8万条数据,目前导入的TXT样本文件达25M,之后的数据会更多,我怕file或file_get_contents函数会吃不消。

    在网上找了一下,发现如下方法很是管用。

    fseek函数不需要把文件全部装入内存,而是直接通过指针来操作,所以效率很高。代码:

    $fp = fopen($file, "r");$line = 10;$pos = -2;$t = " ";$data = "";while ($line > 0) {    while ($t != "/n") {        fseek($fp, $pos, SEEK_END);        $t = fgetc($fp);        $pos --;    }    $t = " ";    $data .= fgets($fp);    $line --;}fclose ($fp);echo $data

    www.it165.net
    再提升一点,按块读取,然后计算块内的/n标记来算到了多少行。

    $fp = fopen($file, "r");$num = 10;$chunk = 4096;$fs = sprintf("%u", filesize($file));$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);for ($len = 0; $len < $max; $len += $chunk) {$seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;    fseek($fp, ($len + $seekSize) * -1, SEEK_END);    $readData = fread($fp, $seekSize) . $readData;     if (substr_count($readData, "/n") &gt;= $num + 1) {        preg_match("!(.*?/n){".($num)."}$!", $readData, $match);        $data = $match[0];        break;    }}fclose($fp);//echo $data;// code to process file contents

    有了这个函数,以后用PHP处理大文件就方便了。

    PS:那家客户公司的领导真是有够龟毛,一个导入功能居然要做三个方案!选定一个不就够了,非要做那么多,你当买菜呀!

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表