Efficiently load and read from large files in PHP with the built-in SplFileObject class.
fopen() becomes very slow and bogged down once the file size starts getting above a couple of Megabytes. The text file I was using for this example was just under 6MB.
The SplFileObject class is a built-in OOP class for PHP that handles reading large files comfortably and resource-friendly due to its nature of not loading the whole file for reading.
Getting total lines in the file
Getting the total amount of lines in a large file:
<?php $file_name = "test_for_spl.txt"; $file = new SplFileObject($file_name); $file->seek($file->getSize()); $total_lines = ($file->key() + 1); echo $total_lines;
This method is incredibly quicker than looping through every line and doing a count as it utilizes a seek onto the end of the file… aka the last line.
Read a certain line only
<?php $file_name = "test_for_spl.txt"; $line_to_read = 24865;//Read line 24865 $file = new SplFileObject($file_name); $file->seek($line_to_read - 1); echo $file->current();//Output the line
To read just a specified line use seek() with minus 1 because it is zero-based line numbers.
Read multiple lines starting at a certain line
There are 2 ways to read multiple lines from a certain line onwards:
<?php
$file_name = "test_for_spl.txt";
$file = new LimitIterator(
new SplFileObject($file_name),
9000,//Start line 9000
100//Read 100 lines
);
foreach ($file as $line) {
echo $line . '<br>'; //Line 9000 to 9100
}or
<?php
$file_name = "test_for_spl.txt";
$start_at = 9000;
$lines_to_read = 100;
$file = new SplFileObject($file_name);
for ($i = 0; $i <= $lines_to_read; $i++) {
$file->seek($start_at + $i);
echo $file->current() . '<br>';
}Unsurprising that seek() makes these quick too.