原来网上抄来的读电子书的代码, 后来发现读取大文件的时候速度太慢了 这次自己重新修改了一下 ,读取速度快了很多了。
原来按字节数读取 现在改用 按行读取, 这样读出乱码的概率也少了许多。
<?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. " <span class='page1'> "; $SQL= $SQL. "<a href=disp.php?page=1&idd=".$_GET["idd"].">首页</a> "; if($page!=1){ $SQL= $SQL. "<a href=disp.php?page=".($page-1)."&idd=".$_GET["idd"].">上一页</a> "; } if($page<$page_count){ $SQL= $SQL. "<a href=disp.php?page=".($page+1)."&idd=".$_GET["idd"].">下一页</a> "; } $SQL= $SQL. "<a href=disp.php?page=".$page_count."&idd=".$_GET["idd"].">尾页</a> "; $SQL= $SQL. "$page/$page_count 页 "; $SQL= $SQL. "</span>"; $SQL= $SQL. " "; $SQL= $SQL. " <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);
发表评论