在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。
需求
有一个800M的日志文件,大约有500多万行, 用php返回最后几行的内容。
实现方法
1. 直接采用file函数来操作
注:由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的memory_limit = 16M来进行设置,这个值如果设置-1,则内存使用量不受限制.
下面是一段用file来取出这具文件最后一行的代码.
整个代码执行完成耗时 116.9613 (s).
$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") >= $num + 1) {
preg_match("!(.*?n){".($num)."}$!", $readData, $match);
$data = $match[0];
break;
}
}
fclose($fp);
echo $data;
我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了.
2.直接调用linux的tail命令来显示最后几行
在linux命令行下,可以直接使用tail -n 10 access.log很轻易的显示日志文件最后几行,可以直接用php来调用tail命令,执行php代码如下.
整个代码执行完成耗时 0.0034 (s)
file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;
3. 直接使用php的fseek来进行文件操作
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法.
方法一
首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。
实现代码如下
整个代码执行完成耗时 0.0095 (s)
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_mp(tail(fopen("access.log","r+"),10));
方法二
还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(n)的个数来判断是否已经读完最后$num行数据.
实现代码如下
整个代码执行完成耗时 0.0009(s).
$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
方法三
整个代码执行完成耗时 0.0003(s)
ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;
php压缩HTML函数轻松实现压缩html/js/Css及注意事项 phpexcel导出excel的颜色和网页中的颜色显示不一致
2. PHP编程基础与实例教程的内容简介
本书共分为13章,涵盖了PHP开发环境的搭建、PHP语法、FORM表单、数据库设计、PHP与数据库连接、会话控制、界面设计等内容。
本书由孔祥盛主编,内容丰富、讲解深入,适用于初、中级PHP用户,可以用做各类院校相关专业的教材,同时也是面向广大PHP爱好者的一本PHP实用参考书。
3. 推荐几本学习PHP的书
《PHP与MySQL程序设计》
《 PHP web 2.0开发实战》
《 PHP高级程序设计:模式、框架与测试 》
《PHP实战》(PHP in Action)
《深入PHP面向对象、模式与实践 (第2版) 》
《PHP和MySQL Web开发原书第4版 》
《 PHP经典实例(第二版)》
《PHP技术内幕》
《 PHP与MYSQL基础教程 》
4. php编程急求答案谢谢
config.php文件内容
<?php
return[
//服务器地址
'hostname'=>'localhost',
//数据库名
'database'=>'',
//用户名
'username'=>'',
//密码
'password'=>'',
//数据库表前缀
'prefix'=>'',
];
5. php书那本好,推荐一本
《PHP编程基础与实例教程》这本书吧,刚买了一本,书看了一个月,看到一半了,涉及的内容较为广泛,讲的深入透彻,能学以致用。你不妨也试试。
6. PHP编程问题,请达人解惑
我知道你的问题出在那了
是SQL语句有问题
$sql = "select * from lesson,teacher where lesson.{$teacherId}=teacher.{$teacherId}";
比如我输入的是一个数字
SELECT *
FROM lesson, teacher
WHERE lesson.4 = teacher.4
那么你的数据表有字段叫4的吗这里的lesson.点后面应该是字段名吧而不是值
改成字段名试试
7. 求经典PHP基础教程
《PHP与MySQL程序设计》《 PHP web 2.0开发实战》《 PHP高级程序设计:模式、框架与测试 》《PHP实战》(PHP in Action) 《深入PHP面向对象、模式与实践 (第2版) 》《PHP和MySQL Web开发原书第4版 》《 PHP经典实例(第二版)》《PHP技术内幕》《 PHP与MYSQL基础教程 》
8. 求推荐初学PHP的教程
进来在网上发现不少朋友在询问有关PHP学习方面的问题,有人担心自己学历低不适合学习,有人担心自己数学基础差不适合学习,也有人担心自己年龄偏大不适合学习,诸如此类。接下来站长就把自己学习PHP的过程分享一下,希望对大家有所帮助。
我是大学毕业1年半左右开始学习PHP的,当时的年龄是22岁,23岁不到。我的主要学习方式就是看书–>看视频教程–>照着视频写代码–>找工作–>工作中学习–>工作之余学习。
一、年龄大怎么办
首先来说一下学习年龄,我毕业的时候是23岁不到,学习的时候实际年龄也没满25岁。以一般人的观点来说,这个年龄学习编程已经不具备年龄优势,但是凡事没有绝对,因人而异,关键在于你自己是否真的想学,有那个毅力,当然也要一点天赋。站长在大学里学过C语言,应该说还有点底子,而恰恰PHP又是用C语言写的,语法方面非常相似,所以入门的时候还不算费劲。也就是在学习PHP的时候我才感觉到大学里用心学习的意义,来日方长,当时用不到,不代表以后就用不到,在此也对那些认为大学里学习无用的朋友说一声:多学一点没坏处。
二、书怎么看
如果你已经下定了决心要学习了,接下来就应该选择一本好教程。【这只是站长的建议,如果你觉得直接看视频更适合你可以选择跳过。】站长并不推荐看国内的计算机教材,内容平平不说,而且很多是过时 的,倒不是贬低国内的计算机水平,只是滥竽充数的实在太多,想找一本好书太难。我看的教材是《PHP与Mysql web开发》原书第四版【之前还看过一本不入眼的教材就不推荐了】,俗称“PHP圣经”,这两个名字你任意网络一个都可以搜到,建议到网上购买,书店里的太贵。如果你之前没有学习过html和javascript,我建议大家先去找这方面的教材看,html和基础javascript都很简单,不需要害怕。
我个人的经验,光看书本你不会学到太多,因为编程是要在实际写代码的过程中才会深刻体会到理论。但是书上的内容可以给你先在脑海中对php是怎么一回事形成一个大概的印象,有一些内容你可能一时无法理解消化,我不建议大家在一个地方停留太久,不行就跳过去,继续往后看,但是要把不懂的地方做一下记号,当我们进行到下一步的时候逐一解决。
三、选择好的视频教程
由于个人的接受方式不一样,所以不存在符合所有人的视频教程。站长先入为主的看了《中学大学PHP教程》,这是台湾中原大学一个老师出的,5集。用来入门是不错的选择,当然也可以去php100中文网看教程,php100的教程比较多,也讲得比较浅,入门也是不错的。建议大家下载看,不要图快,要有耐性,站长当初1天看1集,5天看完的。下载看最大的好处就是,一时走神了没注意可以退回去继续看,o(∩_∩)o 哈哈!在看视频教程的时候,留心注意自己看书时遇到的问题,因为视频教程往往都配有代码讲解,所以应该能够为你解决一部分在看书时遗留下来的问题。
四、动手写代码–依葫芦画瓢
看完书和视频后,就可以尝试自己动手写代码了,站长是照着视频写的,因为第一次写很多地方不记得,经常把视频退回去看他怎么写的【囧!】。这个过程并不舒服,但是咬牙坚持下来,你会发现,依葫芦画瓢就会渐渐催生你自己的代码。因为依葫芦画瓢只是让你理解php网站开发的基本原理,一个功能的具体业务逻辑怎么实现,代码的执行流程是怎么样的,代码以什么样的方式构成,并不是要你生搬硬套,这一点要切记,否则你离开视频就无法动手的话,那就麻烦了!
五、找工作
当你看了一段时间的视频教程,写过一段时间的代码后就可以尝试去找工作了,记住程序员最主要的是编程思想,也就是解决问题的方法,如果你还没有领悟这一点,就不要操之过急。你最好已经写过一些拿得出手的作品,掌握smarty或者任何一种开源框架,框架入门推荐thinkphp。刚出来找PHP工作,期望值低一些,如果是才毕业的没有项目经验,可以找找招实习生的公司或者一些对技术要求不高的小公司,总之先让自己工作,进行实战,在工作中你会遇到很多问题,这都是学习的机会。站长当初写了一个留言板就去找程序员的工作了,而且运气不错,还真让我找到了,呵呵,很多人都觉得不可思议呢!天啊?写一个留言板就去工作了!现在想想,我也够猛的。
六、最后谈一下PHP对数学基础的要求
首先要明确一点,任何编程语言,数学基础好,在学习和使用的过程中都会事半功倍!而在php中,主要是做web开发,并不十分要求高深的算法,所以对数学的要求相对C/C++这类语言来说,是要低得多的。关键在开发的过程中思路要清晰,代码要严谨,所以逻辑思维很重要。而当你深入学习到一定程度,也是需要一定的数学基础来支撑的。毕竟数学基础好说明你的逻辑思维不差,而一些数据结构、特定功能的实现也是需要数学的。
总的来说,如果数学基础差,在刚开始学习的时候是不需要太担心的,但是如果要深入提高,就有必要自己充充电了。
以上就是个人 2年多来的一点经验,关键还是多看、多写、多找。看自己的代码,进行改进优化;看别人的代码,取长补短;写自己的代码,增强语言熟练度和编程经验;遇到不懂的问题,多利用搜索引擎。
只要有恒心、坚持下来,相信大家都会很快度过那段菜鸟的艰苦岁月,变身老鸟向高手达人进发!
这里,站长与诸君共勉,共同在php的世界里闯出自己的新天地!
PS:转载请注明来自第一php网
9. 急!PHP编程
1、<script></script>
2、Notice: Undefined offset: 2
3、aaaaaa
4、501
5、52
6、12
上面的4-6题由于echo输出没有换行和空格,所以这些结果也是没有换行和空格的,比如第6题的12分别代表输出结果是1和2