分页读取txt 文件的修改代码

2020-08-14 22:42:14  阅读 7349 次 评论 0 条

原来网上抄来的读电子书的代码, 后来发现读取大文件的时候速度太慢了 这次自己重新修改了一下 ,读取速度快了很多了。

原来按字节数读取 现在改用 按行读取, 这样读出乱码的概率也少了许多。

<?php

function msubstr($str,$start,$len){ 
    $strlength=$start+$len; 
    $tmpstr="";
    for($i=0;$i<$strlength;$i++) { 
    if(ord(substr($str,$i,1))==0x0a) { 
        $tmpstr.='<br />';
    }
    if(ord(substr($str,$i,1))>0xa0) { 
        $tmpstr.=substr($str,$i,2); 
        $i++; 
    }
    else{ 
        $tmpstr.=substr($str,$i,1); } 
    } 
    $tmpstr=strToUtf8($tmpstr);
    return $tmpstr; 
} 
function strToUtf8($str){
    $encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5',"UTF-16"));
    if($encode == 'UTF-8'){
        return $str;
    }else{
        return mb_convert_encoding($str, 'UTF-8', $encode);
    }
}

    session_start(); 
    header("Content-Type:text/html;charset=utf-8");
    include_once("conMySQL.php");
    if (empty($page)) {$page=1;}
    if (isset($_GET['page'])==TRUE) {$page=$_GET['page']; }
?> 
<?php 
if($page){ 
    $SQL="select idd,id,lx,mc,dx,rq from book where idd=". base64_decode($_GET["idd"]);
     //echo $SQL,"<br>";
    $r=mysqli_query($cn,$SQL);
    if ($r->num_rows > 0) {
        $s=mysqli_fetch_array($r);
        $SQL=$s["id"];
        //echo $SQL. "<br>";
        $filename=substr($SQL,3);
        for($i=strlen($filename);$i<10;$i++){
            $filename="0".$filename;

        }
        $filename="txt/". substr($filename,4,3 ). "/". $filename.".txt";

         //获得文件的行数
         $lines = 0;//初始化行数 
         $c="";
         if ($fh = fopen($filename,'r')) {//打开文件
         while (! feof($fh)) {//判断是否已经达到文件底部
             $c1 = fgets ($fh); //读取需要的行
             //echo "$lines  $c1<br>";
             $lines++;
             if($lines<=($page*200)){
                 if($lines>=($page-1)*200){
                     $c=$c. strip_tags(msubstr($c1,0,strlen($c1)))."<br>";
                 }
             }        
         }
         }

         $page_count=ceil($lines/200);

        $SQL="";
        $SQL= $SQL. "<span class='page1'><font size='6'>".$s["mc"]. "</font>"; 
        $SQL= $SQL. " 类型:".$s["lx"]. "  大小:". $s["dx"]. "kb </span> ";

        //$SQL= $SQL. "</td>";
        //$SQL= $SQL. "</tr>";
        $SQL= $SQL. "&nbsp;<span class='page1'> ";
        
        $SQL= $SQL. "<a href=disp.php?page=1&idd=".$_GET["idd"].">首页</a>&nbsp;&nbsp;&nbsp;";  
        if($page!=1){ 
            $SQL= $SQL. "<a href=disp.php?page=".($page-1)."&idd=".$_GET["idd"].">上一页</a>&nbsp;&nbsp;&nbsp;"; 
        } 
        if($page<$page_count){ 
            $SQL= $SQL. "<a href=disp.php?page=".($page+1)."&idd=".$_GET["idd"].">下一页</a>&nbsp;&nbsp;&nbsp;"; 
        }
        $SQL= $SQL. "<a href=disp.php?page=".$page_count."&idd=".$_GET["idd"].">尾页</a>&nbsp;&nbsp;&nbsp;";  
        $SQL= $SQL. "$page/$page_count 页 ";
        $SQL= $SQL. "</span>";

        $SQL= $SQL. " &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
        $SQL= $SQL. " &nbsp;<span class='page1'>";
        $SQL= $SQL. "<a href='download.php?idd=". $_GET["idd"]. "'>TXT全本</a>  ";
        $SQL= $SQL. " <a href='downzip.php?idd=". $_GET["idd"]. "'>ZIP全本</a>";
        $SQL= $SQL. "</span>";
        }

}?> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title><?php echo $s["mc"]; ?></title> 
<link rel="stylesheet" href="css/disp.css" type="text/css"> 
</head> 
<body> 
 

<table width="100%"> 
    <tr>
        <td>
        <div class="page0">
        <?php echo $SQL; ?>  
        </div>
        <div class='detail'> 
        <?php  echo $c; ?>
        </div>
        <div class="page0">
        <?php echo $SQL; ?>
        </div>
</td> 
</tr> 
</table> 

</body>

主要修改了读取文件地方。原来按字节读取,现在改成按行读取。读取每页数据的200行后显示出来。

         //获得文件的行数
         $lines = 0;//初始化行数 
         $c="";
         if ($fh = fopen($filename,'r')) {//打开文件
         while (! feof($fh)) {//判断是否已经达到文件底部
             $c1 = fgets ($fh); //读取需要的行
             //echo "$lines  $c1<br>";
             $lines++;
             if($lines<=($page*200)){
                 if($lines>=($page-1)*200){
                     $c=$c. strip_tags(msubstr($c1,0,strlen($c1)))."<br>";
                 }
             }        
         }
         }

         $page_count=ceil($lines/200);


本文地址:http://jinesc.cn/?id=180
免责声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?