分页读取txt 文件的修改代码
原来网上抄来的读电子书的代码, 后来发现读取大文件的时候速度太慢了 这次自己重新修改了一下 ,读取速度快了很多了。
原来按字节数读取 现在改用 按行读取, 这样读出乱码的概率也少了许多。
PHP
<?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行后显示出来。
PHP
//获得文件的行数
$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);
登录后可发表评论
点击登录