Introduction to PHP SplFileObject reading large files

Source: Internet
Author: User
Tags spl
Generally, we use fopen or file_get_contents to read files. The former can be read cyclically, and the latter can be read at one time, but all files are loaded at one time.

Generally, we use fopen or file_get_contents to read files. The former can be read cyclically, and the latter can be read at one time, but all files are loaded at one time.

If the size of the file to be loaded is very large, such as several hundred MB or GB, the performance will be reduced. Is there any processing function or class for large files in PHP? The answer is: yes.
PHP is becoming more and more "Object-Oriented", and some of the original basic SPL methods are gradually implementing class.
Starting from PHP 5.1.0, the SPL library has added two standard file operation classes: SplFileObject and SplFileInfo. SplFileInfo is implemented from PHP 5.1.2.
From the literal meaning, we can see that SplFileObject is more powerful than SplFileInfo.
Yes. SplFileInfo is only used to obtain some attributes of a file, such as the file size, file access time, file modification time, and suffix name. SplFileObject inherits the SplFileInfo functions.

The Code is as follows:

/** Return the content of the file from row X to row Y (php5 and php4 are supported)
* @ Param string $ filename file name
* @ Param int $ number of rows starting with startLine
* @ Param int $ number of rows ending with endLine
* @ Return string
*/
Function getFileLines ($ filename, $ startLine = 1, $ endLine = 50, $ method = 'rb '){
$ Content = array ();
$ Count = $ endLine-$ startLine;
// Determine the php version (because SplFileObject is used, PHP> = 5.1.0)
If (version_compare (PHP_VERSION, '5. 1.0 ','> = ')){
$ Fp = new SplFileObject ($ filename, $ method );
$ Fp-> seek ($ startLine-1); // go to row N, the seek method parameter starts counting from 0
For ($ I = 0; $ I <= $ count; ++ $ I ){
$ Content [] = $ fp-> current (); // current () Get the content of the current row
$ Fp-> next (); // next row
}
} Else {// PHP <5.1
$ Fp = fopen ($ filename, $ method );
If (! $ Fp) return 'error: can not read file ';
For ($ I = 1; $ I <$ startLine; ++ $ I) {// skip the previous $ startLine line
Fgets ($ fp );
}
For ($ I; $ I <= $ endLine; ++ $ I ){
$ Content [] = fgets ($ fp); // read the content of the file row
}
Fclose ($ fp );
}
Return array_filter ($ content); // array_filter: false, null ,''
}


Ps: none of the above are added. "read to the end of the judgment ":! $ Fp-> eof () or! Feof ($ fp), coupled with this judgment, affects the efficiency. You can test the running time of many and many rows by yourself, and it is completely unnecessary to add it here.
From the above function, we can see that the use of SplFileObject is much faster than the fgets below, especially when the number of file lines is large and the subsequent content is to be retrieved. Fgets requires two loops and $ endLine loops.
This method took a lot of effort to test a lot of writing, that is, to find the most efficient method. Anyone who thinks it is worthy of improvement should give us some advice.
If yes, the following content is returned:

The Code is as follows:

Echo'

';
var_dump(getFileLines('test.php',35270,35280));
echo '
';

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.