返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php 怎么读大文件 某几行
  • 763
分享到

php 怎么读大文件 某几行

php 2019-06-14 16:06:32 763人浏览 猪猪侠
摘要

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 怎么读大文件 某几行?php读取大文件的多种方法介绍读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

php 怎么读大文件 某几行?

php读取大文件的多种方法介绍

读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。

在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。

需求:

有一个800M的日志文件,大约有500多万行, 用PHP返回最后几行的内容。

实现方法:

直接采用file函数来操作

  由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。

下面是一段用file来取出这具文件最后一行的代码:

<?php
  ini_set('memory_limit', '-1');
  $file = 'access.log';
  $data = file($file);
  $line = $data[count($data) - 1];
  echo $line;
?>

  整个代码执行完成耗时 116.9613 (s)。

  我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万 不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了。

直接调用linux的 tail 命令来显示最 后几行

  在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令,执行PHP代码如下:

<?php
  $file = 'access.log';
  $file = escapeshellarg($file); // 对命令行参数进行安全转义
  $line = `tail -n 1 $file`;
  echo $line;
?>

  整个代码执行完成耗时 0.0034 (s)

直接使用PHP的 fseek 来进行文件操作

  这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法:

方法一

  首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。

实现代码如下

<?php
$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.0095 (s)

方法二

  还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(\n)的个数来判断是否已经读完最后$num行数据。

实现代码如下

<?php
$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;
?>

整个代码执行完成耗时 0.0009(s)。

方法三

<?php
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));
?>

整个代码执行完成耗时 0.0003(s)

方法四,PHP的stream_get_line函数 ,读取快速,读取50万条数据大文件,大概需要20秒左右的时间!例子代码如下

$fp = fopen('./iis.log', 'r'); //文件 
while (!feof($fp)) { 
 //for($j=1;$j<=1000;$j++) {     //读取下面的1000行并存储到数组中 
 $logarray[] = stream_get_line($fp, 65535, "\n"); 
    // break;
 // } 
  
 }

--结束END--

本文标题: php 怎么读大文件 某几行

本文链接: https://lsjlt.com/news/604.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php 怎么读大文件 某几行
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 怎么读大文件 某几行?PHP读取大文件的多种方法介绍读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常...
    99+
    2019-06-14
    php
  • php如何读大文件某几行
    本篇内容介绍了“php如何读大文件某几行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php读大文件某几行的实现方法:1、直接采用file函...
    99+
    2023-06-25
  • php怎么读取大文件末尾n行
    这篇文章主要介绍“php怎么读取大文件末尾n行”,在日常操作中,相信很多人在php怎么读取大文件末尾n行问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php怎么读取大文件末尾n行”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • PHP怎么读取大文件
    小编给大家分享一下PHP怎么读取大文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!衡量成功唯一能确认我们对代码所做改进是否有效的方式是:衡量一个糟糕的情况,然后...
    99+
    2023-06-15
  • linux如何查看文件某几行
    这篇文章主要讲解了“linux如何查看文件某几行”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux如何查看文件某几行”吧!linux查看文件某几行的方法:1、使用sed命令,语法“se...
    99+
    2023-06-30
  • python怎么读取csv中的某几行数据
    使用 python 的 pandas 库,可以按以下步骤读取 csv 中指定行的数据:导入 pandas 库。读取 csv 文件。使用 iloc 方法按行索引号选择特定行。打印或返回子集...
    99+
    2024-04-02
  • php怎么修改文件某一行的数据
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑php修改文件某一行数据的方法以读写的方式打开指定文件使用while()循环+fgets() 函数来控制行数fgets() 函数可以逐行读取文件,一次读取一行数据当指定...
    99+
    2015-10-05
    php 修改文件数据
  • php读取文件最后几行数据的代码是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php读取文件最后几行数据实现思想:借助file()函数将整个文件数据存入数组中,每一行数据对应一个数组元素借助array_slice()函数获取数组中后几个元素即可。...
    99+
    2018-11-25
    php 读取文件
  • Linux怎么通过命令查看日志文件的某几行
    这篇文章主要为大家展示了“Linux怎么通过命令查看日志文件的某几行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux怎么通过命令查看日志文件的某几行”这篇文章吧。【一】从第3000行开始...
    99+
    2023-06-12
  • python怎么读取大文件
    这篇文章主要介绍“python怎么读取大文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python怎么读取大文件”文章能帮助大家解决问题。可以通过两种方法利用python读取大文件:第一种是利用...
    99+
    2023-06-30
  • 怎么用Python获取numpy数组的某几行某几列
    这篇文章主要讲解了“怎么用Python获取numpy数组的某几行某几列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python获取numpy数组的某几行某几列”吧!前言:今天为大家带...
    99+
    2023-06-16
  • linux如何读取文件的前几行
    今天小编给大家分享一下linux如何读取文件的前几行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,可用hea...
    99+
    2023-06-30
  • 如何在 PHP 中逐行读取一个大文件
    在本文中,我们将介绍在 PHP 中逐行读取一个大文件的方法。 使用 fgets() 函数 使用 file() 函数 使用 stream_get_line() 函数 在 ...
    99+
    2024-02-27
  • php如何删除文件某一行
    本篇内容主要讲解“php如何删除文件某一行”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何删除文件某一行”吧!php删除文件某一行的方法:首先定义操作文件;然后读取文件数据到数组中;最后...
    99+
    2023-06-20
  • python怎么获取文件的某行
    使用python获取文件指定行的方法:1.新建python项目;2.导入linecache模块;3.使用open()函数打开文件;4.使用linecache.getline()方法获取指定行;具体步骤如下:首先,打开python,并新建一个...
    99+
    2024-04-02
  • 怎么中python读取大文件
    本篇文章为大家展示了怎么中python读取大文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞...
    99+
    2023-06-14
  • Nodejs如何进行大文件读写
    这篇文章主要介绍了Nodejs如何进行大文件读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Nodejs如何进行大文件读写文章都会有所收获,下面我们一起来看看吧。一、node...
    99+
    2024-04-02
  • PHP中怎么读取文件
    本篇文章给大家分享的是有关PHP中怎么读取文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。< php  $file = '...
    99+
    2023-06-17
  • Python按行读取文件的实现方法【小文件和大文件读取】
    本文实例讲述了Python按行读取文件的实现方法。分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #funct...
    99+
    2022-06-04
    文件 大文件 方法
  • PHP如何读取单行文件
    这篇文章给大家分享的是有关PHP如何读取单行文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP 读取单行文件 - fgets()fgets() 函数用于从文件读取单行。下例...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作