这里有新鲜出炉的 PHP 设计模式,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
php 中读取文件非常简单,但如果读取的文件非常大,改如何解决呢?我们可以直接使用 fseek 来进行大文件操作,本文章向大家介绍 php 使用 fseek 函数读取大文件,需要的朋友可以参考一下
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_dump(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
来源: http://www.phperz.com/article/17/0805/342107.html