Home Backend Development PHP Tutorial PHP 大文件的读取和写入有关问题

PHP 大文件的读取和写入有关问题

Jun 13, 2016 pm 12:11 PM
content file path

PHP 大文件的读取和写入问题


    在通常的学习和开发中,因为我们很少会接触到大量数据的读取和写入,所以当突然有了这种需求的时候,我们可

能仍然会按照一些比较快捷的方法,像file_get_contents,fread等方法来读取文件,不过这样以来如果读取的文件太

大,就会产生问题,在实现大文件读取和写入的时候查找了网上的一些资料,不过有些例子给的不是很符合我的需

求,所以我就结合网上已有的例子,再写一篇总结性的博客吧

    那么究竟会产生什么问题呢,这就要说一些PHP的底层实现数,file_get_contents和fread来说一下,首先说一下

PHP中文件读取的函数,file_get_contents和fread,这两个函数其实原理是相同的,都是读取内容到系统的内存中,

不过如果只是想将一个文件的内容读入到一个字符串中,请使用file_get_contents(),它的性能比 fread() 好得多。

在读取不是很大的文件还是没有问题的,不过当读取大文件的时候(例如2GB的日志),如果你机器的内存只有4G,

如果你将整个文件全部读取然后存入字符串中,就可能会导致系统的内存爆掉造成卡死,因为还有一部分内存要用于

维持系统的运行和其他进程的运行,既然会这样,我们就需要一些其他办法来避免一次性读取太多的内容,通过这种

办法来实现大文件的读取。


PHP文件读取:

下面这个是网上读取大文件的一个例子,来说明上面内存会爆掉的现象。。


_________________________________无敌分割线_______________________________________



需求如下:  现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容。

实现方法:

1. 直接采用file函数来操作

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

下面是一段用file来取出这具文件最后一行的代码.
整个代码执行完成耗时 116.9613 (s).

php对大文件进行读取操作【OK】 - PHP程序员 - 李国华【PHP程序员C++】博客

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


_____________________________________无敌分割线_____________________________________


上面的例子虽然是读取最后几行的例子,不过由于对文件的内容进行了遍历,所以跟读取整个文件是一样的,不过如

果是为了读取最后几行的内容,也可以直接用fseek来进行定位读取部分内容。


下面我们来一起探讨下如何对大文件进行读取和写入。


大文件读取:

因为要求读取部分,如果文件不是特别大,可以通过file_get_contents或fread自带的分割参数来进行分块来进行读取(这个地方感觉需要加一个sleep函数,来减少IO的峰值大小,不过不知是否正确,希望大牛指点),还有一种方法,就是通过while循环,用fgets来进行逐行的读取,因为fgetss是通过文件指针读取一行,效率是比较高的。


下面附上通过fgets实现的大文件读取并对文件内容进行编码转换(UTF-8 -> GBK)的例子,代码如下:


            $file = fopen($old_file_path,"r");            $result = fopen($temporary_file_path,"a");            $re_sign = 0;             while(!feof($file))            {                $content = fgets($file);                $encode = mb_detect_encoding($content, array('ASCII','UTF-8','GB2312','GBK','BIG5'));                 if ($encode == 'UTF-8') {                    $str = iconv($encode,"GBK//IGNORE", $content);                    $encode = mb_detect_encoding($content, array('ASCII','UTF-8','GB2312','GBK','BIG5'));                     fwrite($result, $str);                     $re_sign = 1;                 } else {                                        fwrite($result, $content);                 }            }            fclose($file);            fclose($result);            if($re_sign == 1){                                rename($old_file_path, $old_file_path . '.bak' );                rename($temporary_file_path, $old_file_path);                            } else {                unlink($temporary_file_path);            }
Copy after login


大文件写入:


大文件的写入相对大文件读取来说产生的代价不是很大,因为文件写入是写入到硬盘中,如果一次性写入文件过多,

只会产生卡硬盘的现象,如果从效率上来讲一次性直接写入的耗时和效率最高,所以大文件的写入的话建议一次性读取后直接写入文件中。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Use java's File.length() function to get the size of the file Use java's File.length() function to get the size of the file Jul 24, 2023 am 08:36 AM

Use Java's File.length() function to get the size of a file. File size is a very common requirement when dealing with file operations. Java provides a very convenient way to get the size of a file, that is, using the length() method of the File class. . This article will introduce how to use this method to get the size of a file and give corresponding code examples. First, we need to create a File object to represent the file we want to get the size of. Here is how to create a File object: Filef

Hongmeng native application random poetry Hongmeng native application random poetry Feb 19, 2024 pm 01:36 PM

To learn more about open source, please visit: 51CTO Hongmeng Developer Community https://ost.51cto.com Running environment DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. To create an application, click File- >newFile->CreateProgect. Select template: [OpenHarmony] EmptyAbility: Fill in the project name, shici, application package name com.nut.shici, and application storage location XXX (no Chinese, special characters, or spaces). CompileSDK10, Model: Stage. Device

How to convert php blob to file How to convert php blob to file Mar 16, 2023 am 10:47 AM

How to convert php blob to file: 1. Create a php sample file; 2. Through "function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })} ” method can be used to convert Blob to File.

Steps to set the PATH environment variable of the Linux system Steps to set the PATH environment variable of the Linux system Feb 18, 2024 pm 05:40 PM

How to set the PATH environment variable in Linux systems In Linux systems, the PATH environment variable is used to specify the path where the system searches for executable files on the command line. Correctly setting the PATH environment variable allows us to execute system commands and custom commands at any location. This article will introduce how to set the PATH environment variable in a Linux system and provide detailed code examples. View the current PATH environment variable. Execute the following command in the terminal to view the current PATH environment variable: echo$P

Rename files using java's File.renameTo() function Rename files using java's File.renameTo() function Jul 25, 2023 pm 03:45 PM

Use Java's File.renameTo() function to rename files. In Java programming, we often need to rename files. Java provides the File class to handle file operations, and its renameTo() function can easily rename files. This article will introduce how to use Java's File.renameTo() function to rename files and provide corresponding code examples. The File.renameTo() function is a method of the File class.

Use java's File.getParent() function to get the parent path of the file Use java's File.getParent() function to get the parent path of the file Jul 24, 2023 pm 01:40 PM

Use java's File.getParent() function to get the parent path of a file. In Java programming, we often need to operate files and folders. Sometimes, we need to get the parent path of a file, which is the path of the folder where the file is located. Java's File class provides the getParent() method to obtain the parent path of a file or folder. The File class is Java's abstract representation of files and folders. It provides a series of methods for operating files and folders. Among them, get

Use java's File.getParentFile() function to get the parent directory of the file Use java's File.getParentFile() function to get the parent directory of the file Jul 27, 2023 am 11:45 AM

Use java's File.getParentFile() function to get the parent directory of a file. In Java programming, we often need to operate files and folders. When we need to get the parent directory of a file, we can use the File.getParentFile() function provided by Java. This article explains how to use this function and provides code examples. File class in Java is the main class used to operate files and folders. It provides many methods to obtain and manipulate file properties

How to set the path environment variable How to set the path environment variable Sep 04, 2023 am 11:53 AM

Method to set the path environment variable: 1. Windows system, open "System Properties", click the "Properties" option, click "Advanced System Settings", in the "System Properties" window, select the "Advanced" tab, and then click "Environment Variables" " button, find and click "Path" to edit and save; 2. For Linux systems, open the terminal, open your bash configuration file, add "export PATH=$PATH: file path" at the end of the file and save it; 3. For MacOS system, the operation is the same as above.

See all articles