首页 > 编程技术 > php

php读取大文件最好的实现方法

发布时间:2016-11-25 15:39

php读取大文件方法我们一般是一行行来讲取而不是一次性把文件全部写入内存中了,这样会导致php程序卡死,下面给大家整理一个例子。
 代码如下 复制代码


读取大文件最后几行数据:
/**
 * 取文件最后$n行
 * @param string $filename 文件路径
 * @param int $n 最后几行
 * @return mixed false表示有错误,成功则返回字符串
 */
function FileLastLines($filename,$n){
    if(!$fp=fopen($filename,’r')){
        echo ”打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文”;
        return false;
    }
    $pos=-2;
    $eof=”";
    $str=”";
    while($n>0){
        while($eof!=”n”){
            if(!fseek($fp,$pos,SEEK_END)){
                $eof=fgetc($fp);
                $pos–;
            }else{
                break;
            }
        }
        $str.=fgets($fp);
        $eof=”";
        $n–;
    }
    return $str;
}

echo nl2br(FileLastLines(‘sss.txt’,4));
/**  * 取文件最后$n行  * @param string $filename 文件路径  * @param int $n 最后几行  * @return mixed false表示有错误,成功则返回字符串  */ function FileLastLines($filename,$n){     if(!$fp=fopen($filename,'r')){         echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";         return false;     }     $pos=-2;     $eof="";     $str="";     while($n>0){         while($eof!="n"){             if(!fseek($fp,$pos,SEEK_END)){                 $eof=fgetc($fp);                 $pos--;             }else{                 break;             }         }         $str.=fgets($fp);         $eof="";         $n--;     }     return $str; } echo nl2br(FileLastLines('sss.txt',4));

 

function tail($fp,$n,$base=5)
{
assert($n>0);
$pos = $n+1;
$lines = array();
while(count($lines)< =$n){
try{
fseek($fp,-$pos,SEEK_END);
} catch (Exception $e){
fseek(0);
break;
}
$pos *= $base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));
$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

下面本文章来给大家介绍关于php备忘模式之星际争霸一个应用例子,希望例子能帮助到各位吧。

我们在玩星际任务版或者单机与电脑对战的时候,有时候会突然要离开游戏,或者在出兵前面,需要存储一下游戏。

那么我们通过什么办法来保存目前的信息呢?而且在任何时候,可以恢复保存的游戏呢?

待解决的问题:保存游戏的一切信息,如果恢复的时候完全还原。

思路:建立一个专门保存信息的类,让他来处理这些事情,就像一本备忘录。
为了简单,我们这里用恢复一个玩家的信息来演示。

 代码如下 复制代码

//备忘类

class Memento

{

  //水晶矿

  public $ore;

  //气矿

  public $gas;

  //玩家所有的部队对象

  public $troop;

  //玩家所有的建筑对象

  public $building;

  //构造方法,参数为要保存的玩家的对象,这里强制参数的类型为Player类

  public function __construct(Player $player)

  {

  //保存这个玩家的水晶矿

  $this->ore = $player->ore;

  //保存这个玩家的气矿

  $this->gas = $player->gas;

  //保存这个玩家所有的部队对象

  $this->troop = $player->troop;

  //保存这个玩家所有的建筑对象

  $this->building = $player->building;

  }

}

//玩家的类

class Player

{

  //水晶矿

  public $ore;

  //气矿

  public $gas;

  //玩家所有的部队对象

  public $troop;

  //玩家所有的建筑对象

  public $building;

  //获取这个玩家的备忘对象

  public function getMemento()

  {

   return new Memento($this);

  }

  //用这个玩家的备忘对象来恢复这个玩家,这里强制参数的类型为Memento类

  public function restore(Memento $m)

  {

    //水晶矿

  $this->ore = $m->ore;

  //气矿

  $this->gas = $m->gas;

  //玩家所有的部队对象

  $this->troop = $m->troop;

  //玩家所有的建筑对象

  $this->building = $m->building;

  }

}

//制造一个玩家

$p1 = new Player();

//假设他现在采了100水晶矿

$p1->ore = 100;

//我们先保存游戏,然后继续玩游戏

$m = $p1->getMemento();

//假设他现在采了200水晶矿

$p1->ore = 200;

//我们现在载入原来保存的游戏

$p1->restore($m);

//输出水晶矿,可以看到已经变成原来保存的状态了

echo $p1->ore;

用途总结:备忘模式使得我们可以保存某一时刻为止的信息,然后在需要的时候,将需要的信息恢复,就像游戏的保存和载入归档一样。

实现总结:需要一个备忘类来保存信息,被保存的类需要实现生成备忘对象的方法,以及调用备忘对象来恢复自己状态的方法。

如果你没有服务器权限但服务器有些功能给禁止了这时我们就可以通过下面的方法来尝试设置开启此功能哦,下面我给各位整理了不少。


php.ini常用到的修改信息(自定义设置)@
@ini_set('memory_limit', '64M'); /* 脚本最大占用内存大小 */

@ini_set('max_execution_time', '15'); /* 脚本最大执行时间 */

@ini_set('post_max_size', '12M'); /* 表单最大上传大小 */

@ini_set('upload_max_filesize', '2M'); /* 单个文件最大上传大小 */

@ini_set('session.name', 'anhuizhaopin_sessionid'); /* SESSIONID的名称 */

@ini_set('session.cookie_httponly', '1'); /* sessionid是否添加HTTPONLY属性 */

@ini_set('session.use_trans_sid', '0'); /* 不尝试从其他地方获得sessionid */

@ini_set('session.use_cookies', '1'); /* 使用cookies传递sessionid */

@ini_set('session.auto_start', '0'); /* 不自动开始session处理 */

@ini_set('session.cookie_lifetime', '3600'); /* session的生命周期 */

@ini_set('session.gc_maxlifetime', '3600'); /* gc时间 */

@ini_set('session.cache_expire', '180'); /* 客户端缓存时间 */

@ini_set('file_uploads', '1'); /* 是否启用上传文件 */

@ini_set('upload_tmp_dir', 'F:\\tmp\\'); /* 上传文件缓存目录 */

无刷新功能我们用到很多很多的,下面我就来给各位介绍一个实例,就是实现php+ajax实现无刷新数据分页了,例子非常的简单大家只要按流程来操作就可以了哦。

index.php 文件如下图所示

 代码如下 复制代码

<?php
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
?>
<html>
<head>
<title>ajax分页演示</title>
<script language="javascript"" width=100% src="ajaxpg.js"></script>
<link rel="stylesheet" type="text/css" href="page.css">
</head>
<body>
<div id="result">
<?php
$page=isset($_GET['page'])?intval($_GET['page']):1;  //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=3;  //每页显示10条数据


$db=mysql_connect("localhost","root","123456");  //创建数据库连接
mysql_select_db("demo",$db) or die("数据库链接错误");  //选择要操作的数据库
mysql_query("set names gbk");
/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据库除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/


$result=mysql_query("select * from brand");
$total=mysql_num_rows($result); //查询所有的数据


$url='test.php';//设置ajax提交页面地址的URL,这里设置成test.php通过ajax把参数传递给test.php再把处理过的内容赋值到本页的div id=result。

//页码计算
$pagenum=ceil($total/$num);//获得总页数,也是最后一页
$page=min($pagenum,$page);//获得首页
$prepg=$page-1;//上一页
$nextpg=($page==$pagenum ? 0 : $page+1);//下一页
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
$pagenav="<ul>";


//开始分页导航条代码:
$pagenav.="<li>显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 条记录</li><li>共 $total 条记录&nbsp;</li>";


//如果只有一页则跳出函数:
if($pagenum<=1) return false;


$pagenav.="<li> <a href=javascript:dopage('result','$url?page=1');>首页</a></li> ";
if($prepg) $pagenav.="<li> <a href=javascript:dopage('result','$url?page=$prepg');>前页</a></li> "; else $pagenav.=" <li>前页</li> ";
if($nextpg) $pagenav.="<li><a href=javascript:dopage('result','$url?page=$nextpg');>后页</a> </li>"; else $pagenav.=" <li>后页</li> ";
$pagenav.="<li> <a href=javascript:dopage('result','$url?page=$pagenum');>尾页</a></li> ";
$pagenav.="<li>第 $page 页</li><li>共 $pagenum 页</li></ul>";


//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum){
 Echo "Error : Can Not Found The page ".$page;
 Exit;
}
?></div><div id="results">
<?php
  echo $pagenav;//输出分页导航
?>
</div>
</body>
</html>

css代码

/* CSS Document */
/* CSS Document */
#result ul li{
height:20px;
width:auto;
display:block;
color:#999;
border:1px solid #999;
float:left;
list-style:none;
font-size:12px;
margin-left:5px;
line-height:20px;
vertical-align:middle;
text-align:center;
}
#result ul li a:link{
width:50px;
height:20px;
display:block;

line-height:20px;
background:#09C;
border:1px solid #fff;
color:#fff;
text-decoration:none;
}
#result ul li a:hover{
width:50px;
height:20px;
display:block;

line-height:20px;
background:#09C;
border:1px solid #fff;
color:#F60;
text-decoration:none;
}

ajaxpg.js文件如下

// JavaScript Document
var http_request=false;
  function send_request(url){//初始化,指定处理函数,发送请求的函数
 http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
http_request=new XMLHttpRequest();
if(http_request.overrideMimeType){//设置MIME类别
  http_request.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject){//IE浏览器
try{
 http_request=new ActiveXObject("Msxml2.XMLHttp");
}catch(e){
 try{
 http_request=new ActiveXobject("Microsoft.XMLHttp");
 }catch(e){}
}
 }
if(!http_request){//异常,创建对象实例失败
window.alert("创建XMLHttp对象失败!");
return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
 http_request.open("GET",url,true);
http_request.send(null);
  }
  //处理返回信息的函数
  function processrequest(){
if(http_request.readyState==4){//判断对象状态
  if(http_request.status==200){//信息已成功返回,开始处理信息
 document.getElementById("results").style.display="none";
 document.getElementById(reobj).innerHTML=http_request.responseText;
}
else{//页面不正常
 alert("您所请求的页面不正常!");
}
}
  }
  function dopage(obj,url){
document.getElementById(obj).innerHTML="<font color='green' font-size='12'>正在读取数据...</font>";
send_request(url);
reobj=obj;
}
 

数据库文件如下

-- phpMyAdmin SQL Dump
-- version 2.8.1
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2010 年 01 月 22 日 14:41
-- 服务器版本: 5.0.22
-- PHP 版本: 5.2.12
--
-- 数据库: `demo`
--

-- --------------------------------------------------------

--
-- 表的结构 `brand`
--

CREATE TABLE `brand` (
  `id` int(7) NOT NULL auto_increment,
  `sp_brand` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;

--
-- 导出表中的数据 `brand`
--

INSERT INTO `brand` (`id`, `sp_brand`) VALUES (1, 'hello world'),
(2, '你好'),
(3, '恩'),
(4, 'fdsafdsafdsa'),
(5, 'fdsafdafdsafdas'),
(6, 'fdsafdsa'),
(7, 'fdsafdsafdas'),
(8, '恩'),
(9, '恩'),
(10, '恩'),
(11, '恩11'),
(12, '恩'),
(13, '恩'),
(14, '恩'),
(15, '恩'),
(16, '恩'),
(17, '恩'),
(18, '恩18');


下面介绍这些文件的功能


ajaxpg.js:ajax无刷新核心文件,一般不要去作修改。

index.php:实现ajax无刷新的文件了,这里调用了ajaxpg.js文件,配置了mysql用户密码,要和自己本地的一致,以及显示分页的效果。

page.css:这是分页的CSS样式文件,用来美化的,就不多介绍了。

brand.sql:这是MYSQL数据库的文件了,进行导入到MYSQL数据库中,同样,如果不会导入,可以参考PHPfensi.com中如何导入.sql文章即可。

ajax注册是现在我看到网站中所有网站几乎都会使用到的一个功能,下面我就来给各位整理一个关于ajax注册验证例子,希望此例子能帮助到各位哦。

html代码

 代码如下 复制代码

<script" width=100% src="ajax.js"></script>
<form>
<table>
<tr>
  <td>用户名:</td>
  <td><input type="text" id="txt1" onKeyUp="showHint(this.value)"></td>
 </tr>
 <tr align="center">
  <td colspan="2"><span id="txtHint"></span></td>
 </tr>
</table>
</form>

js文件代码

 代码如下 复制代码

var xmlHttp
function showHint(str)
{
if (str.length==0)
  {
  document.getElementById("txtHint").innerHTML=""
  return
  }
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
  {
  alert ("Browser does not support HTTP Request")
  return
  }
xmlHttp.onreadystatechange=stateChanged

var geturl="conn.php?q="+str
//sid是增加一个随机数 防止页面启用缓存技术·
geturl=geturl+"&sid="+Math.random()
geturl=encodeURI(geturl);
geturl=encodeURI(geturl);
xmlHttp.open("GET",geturl,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
 {
 document.getElementById("txtHint").innerHTML=xmlHttp.responseText
 }
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
 {
 // Firefox, Opera 8.0+, Safari
 xmlHttp=new XMLHttpRequest();
 }
catch (e)
 {
 // Internet Explorer
 try
  {
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }
 catch (e)
  {
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }
return xmlHttp;
}

php操作

 代码如下 复制代码

<?php
$q=$_GET["q"];
$q = urldecode($q);

if (strlen($q) > 0)
{
  $conn = @mysql_connect("localhost","root","1010") or die ("MySql连接错误");
  mysql_select_db("xin",$conn);
  mysql_query("set names 'utf8'");
  
  $sql = "SELECT username FROM message WHERE username = '$q'";
  $query = mysql_query($sql);
  @$row = mysql_fetch_array($query);
  
  if(!empty($row['username']))
  {
   $response = "<font color=red>已经被注册!</font>";
  }else
  {
   $response = "<font color=blue>恭喜!可以注册!</font>";
  }
  
  echo $response;
}

?>

最后再给出数据库

 代码如下 复制代码

DROP DATABASE IF EXISTS `xin`;
CREATE DATABASE `xin` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `xin`;


CREATE TABLE `message` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

标签:[!--infotagslink--]

您可能感兴趣的文章: