PHP 通过实现 Iterator(迭代器)接口来读取大文件文本
读了NGINX的access日志,bnb_manage_access.log(31M) 和 bnb_wechat_access.log(50M)
附上代码:
- <?php
- /**
- * User: szliugx@gmail.com
- * Date: 2018/8/3
- * Time: 下午3:34
- */
- class FileIterator implements Iterator
- {
- // 打开的文件句柄
- private $fp;
- // 打开的文件行数
- private $lineNumber;
- // 行内容
- private $lineContent;
- public function __construct($file)
- {
- $fp = fopen($file, "r");
- if (!$fp) {
- throw new Exception("「{$file}」不能打开");
- }
- $this->fp = $fp;
- }
- public function current()
- {
- //echo "current — 返回当前元素 \n";
- $this->lineContent = fgets($this->fp);
- return rtrim($this->lineContent, "\n");
- }
- public function next()
- {
- //echo "next — 向前移动到下一个元素 \n";
- $this->lineNumber++;
- }
- public function key()
- {
- //echo "key — 返回当前元素的键 \n";
- return $this->lineNumber;
- }
- public function valid()
- {
- //echo "valid — 检查当前位置是否有效 \n";
- return feof($this->fp) ? false : true;
- }
- public function rewind()
- {
- //echo "rewind — 返回到迭代器的第一个元素 \n";
- $this->lineNumber = 1;
- }
- }
- $file = "/Users/liugx/work/php/laravel_wechat_demo/bnb_wechat_access.log";
- try {
- $fileIterator = new FileIterator($file);
- } catch (Exception $e) {
- echo "出错啦:" . $e->getMessage();
- exit;
- }
- $flag = 0;
- $lineNumber = 0;
- $startTime = microtime(true);
- foreach ($fileIterator as $k => $v) {
- if (strpos($v, "测试查找") !== false) {
- echo sprintf("找到啦:%d行出现了内容「%s」\n", $k, $v);
- $flag = 1;
- }
- $lineNumber = $k;
- }
- $endTime = microtime(true);
- if ($flag == 0) {
- echo "遍历了整个文件也没有找到\n";
- }
- $time = bcsub($endTime, $startTime, 3) * 1000;
- echo sprintf("查找 %s 文件耗时:%s ms,共 %d 行\n", $file, $time, $lineNumber);
PHP 通过实现 Iterator(迭代器)接口来读取大文件文本的更多相关文章
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) { # 打开文件 $handle = fopen($file, 'rb'); while (feof($ ...
- 强悍的Python读取大文件的解决方案
这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...
- pandas读取大文件时memoryerror的解决办法
再用pd.read_csv读取大文件时,如果文件太大,会出现memoryerror的问题. 解决办法一:pd.read_csv的参数中有一个chunksize参数,为其赋值后,返回一个可迭代对象Tex ...
- PHP如何快速读取大文件
在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...
- java读取大文件
1 多线程 2 java内存映射读取大文件
- php使用file函数、fseek函数读取大文件效率分析
php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- PHP读取大文件的几种方法介绍
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...
- Java 读取大文件方法
需求:实际开发中读取文本文件的需求还是很多,如读取两个系统之间FTP发送文件,读取后保存到数据库中或日志文件的数据库中保存等. 为了测试首先利用数据库SQL生成大数据文件. 规则是 编号|姓名|手机号 ...
随机推荐
- Ubuntu16.04下安装tensorflow(GPU加速)【转】
本文转载自:https://blog.csdn.net/qq_30520759/article/details/78947034 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- 2016湘潭邀请赛—Gambling
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1244 题意:有a个红球,b个绿球,c个黄球,先拿完a个红球一等奖,先拿完b ...
- BZOJ 3123 【SDOI2013】 森林
题目链接:森林 这道题想法很显然.既然只有加边而没有删边,那么每次启发式合并就可以了.查询路径\(k\)小似乎需要主席树,那么把主席树和倍增表一起暴力重构就好了. 然后发现这样的空间复杂度是\(O(n ...
- Ubuntu14.04,16.04(桌面版)找回root 密码
一.重启系统,按住shift键直到出现GUN GRUB界面(下图) 选择advanced options,按回车 然后移动选择到recovery mode ,接着按下e,不要按回车,因为我们要进入可写 ...
- ipconfig会出现多个IP地址
一.问题描述 今天调试程序的时候发现电脑有两个IP地址,一时间不知道该用哪个?如下图: 二.问题分析 第一个叫ppp适配器,是一个逻辑的虚拟设备,ppp的意思是Point-to-Point Proto ...
- HttpClient将手机上的数据发送到服务器
到官网下载jar包,下载GA发布版本即可 在项目中将httpclient-4.5.5.jar.httpcore-4.4.9.jar.httpmime-4.5.5.jar.commons-logging ...
- mysql插入中文数据报错 java.sql.SQLException: Incorrect string value: '\xE5\x90\x88\xE8\xAE\xA1' for column
1.我们创建数据库的时候没有更改数据库的字符集为utf8. 在mysql工具中,右击数据库,->"改变数据库",->选择“基字符集”为utf-8; 2,数据库中表的字符 ...
- spring的懒加载和depends-on
①延迟初始化Bean(惰性初始化Bean)是指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性 ...
- IOS-组件化架构漫谈
本文作者: 伯乐在线 - 刘小壮 .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目
- 网络流量预测 国内外研究现状【见评论】——传统的ARIMA、HMM模型,目前LSTM、GRU、CNN应用较多,貌似小波平滑预处理步骤非常关键
Time Series Anomaly Detection in Network Traffic: A Use Case for Deep Neural Networks from:https://j ...