Чтобы прочитать текстовую информацию из файла можно использовать, по крайней мере, 4 функции: fgets(), file(), file_get_contents(), fread(). Первая, конечно, явный аутсайдер. Но все же интересно посмотреть на время выполнения одной и той же задачи этими функциями.
Итак, берем файл размером 50Мб и поочередно просто начинаем читать его содержимое.
1. Для функции fgets() использовался такой цикл:
$rHandle = fopen($file,'r');
while (!feof($rHandle)) {
$str = fgets($rHandle);
};
fclose($rHandle);
2. Для функции file() просто:
$Array = file($file);
3. То же для file_get_contents():
$content = file_get_contents($file);
4. Функция fread() вызывалась так:
$rHandle = fopen($file,'r');
$content = fread($rHandle, filesize($file));
fclose($rHandle);
Вот результаты выполнения:
Функция | Время выполнения |
fgets() | 1.0536 |
file() | 0.6769 |
file_get_contents() | 0.1257 |
fread() | 0.0923 |
Как и ожидалось цикл с fgets() оказался худшим вариантом. Функции file_get_contents() и fread() показали похожий результат, и, не смотря на то, что fread() оказалась в данном случае быстрее, официальная документация рекомендует использовать file_get_contents(), потому что эта функция работает по некому алгоритму «memory mapping» (если тот поддерживается ОС). Будем верить ТД.
Однако, тест получился все же нечестный, потому что результатом выполнения file_get_contents() и fread() стали просто строки, а функция file() вернула целый массив. Поэтому было бы интересно переделать строку в аналогичный массив, добавив:
$Array = explode(chr(13).chr(10),$content);
Вот результат (время выполнения функции file() просто перенесли в эту таблицы из прошлой):
Функция | Время выполнения |
file() | 0.6769 |
file_get_contents() | 0.6439 |
Результат неоднозначный: с одной стороны мы говорим о файле в 50Мб (часто ли приходится читать файлы такого объема), с другой стороны это результат одного лишь обращения (если при одном запросе мы выигрываем 0.033 секунды, то всего 30 запросов экономят целую секунду).
Также были проведены тесты с файлом в 0.5Мб и при малых количествах повторений цикла преимущество все же было на стороне функции file_get_contents() с последующей explode(). И лишь когда количество повторений цикла превысило 1000, то функция file() наконец-то вышла в лидеры:
Функция | Время выполнения |
file() | 9.5285 |
file_get_contents() | 9.9103 |