Является ли файл_get_contents медленнее, чем включать?

есть система кэширования файлов для библиотеки php 5, которую я часто использую. когда запрос сделан, я проверяю кешированный файл, если есть один, я его выношу и выхожу.

$contents = file_get_contents( self::_cacheFile() );
echo $contents;
exit();     

Мне нужно делать file_get_contents, а не просто включать из-за кэшированных xml файлов с pesky

`<?xml version="1.0"?>` 

Есть ли лучший способ вытащить файлы кеша без стрельбы?

Ответы

Ответ 1

Если все, что вы хотите сделать, это вывести содержимое файла, вы должны использовать readfile(). Это быстрее и меньше памяти, чем файл_get_contents()

Ответ 2

Так как include будет оценивать содержимое файлов, например. запустите через PHP-интерпретатор, а также используйте include_path для поиска файлов, я бы сказал, что include работает медленнее. file_get_contents будет обрабатывать содержимое файла только как строку. Меньше накладных расходов, больше скорости.

На странице :

file_get_contents() является предпочтительным способом чтения содержимого файла в строку. Он будет использовать методы сопоставления памяти, если их поддерживает ваша ОС для повышения производительности.

Однако, если вы после вывода файла вместо того, чтобы вставлять его в строку, readfile() даже немного быстрее, чем file_get_contents. Учитывая, что include 'ing выведет любой не PHP-контент, это, скорее всего, более вероятно, что вы после того, как я предполагаю.

Пересмотренный тест на моем настольном компьютере:

$start1 = microtime(1);
for($i=0; $i<100000; $i++) {
    include 'log.txt';
}
$end1 = microtime(1) - $start1;

и

$start2 = microtime(1);
for($i=0; $i<100000; $i++) {
    echo file_get_contents('log.txt');
}
$end2 = microtime(1) - $start2;

и

$start3 = microtime(1);
for($i=0; $i<100000; $i++) {
    readfile('log.txt');
}
$end3 = microtime(1) - $start3;

Результат

echo PHP_EOL, $end1, // 137.577358961
     PHP_EOL, $end2, // 136.229552984
     PHP_EOL, $end3; // 136.849179029

Ответ 3

file_get_contents и include не делает то же самое:

  • file_get_contents читает содержимое файла и возвращает его как строку
  • include выполнит содержимое файла.

О скорости, без кэша кода операции, я полагаю, что file_get_contents должен теоретически быть быстрее, поскольку он меньше вычисляет (нет компиляции/выполнения кода).

Тем не менее, самое главное, вероятно, это то, что вы пытаетесь сделать: если вы хотите читать только файл, вы должны использовать file_get_contents.

Ответ 4

Ничто не сравнится с (хорошо сделанным) эталоном (что сложнее, чем кажется, я мог бы что-то игнорировать). Тем не менее, поскольку оба сделаны в тех же условиях, они должны служить измерительной палочкой.

test.txt - текстовый файл с 12 КБ, 876 строк:

[email protected]:~$ ls -la test.txt ; wc -l test.txt
-rw-r--r-- 1 vinko vinko 12264 2010-02-24 19:08 test.txt
876 test.txt

file_get_contents.php:

[email protected]:~$ more file_get_contents.php
<?php
echo file_get_contents("test.txt");
?>

include.php

[email protected]:~$ more include.php
<?php
include("test.txt");
?>

readfile.php

[email protected]:~$ more readfile.php
<?php
readfile("test.txt");
?>

Итак, время выполнения 10 тысяч итераций каждого из них:

[email protected]:~$ time for i in `seq 10000`; do php file_get_contents.php >/dev/null; done

real    3m57.895s
user    2m35.380s
sys     1m15.080s

[email protected]:~$ time for i in `seq 10000`; do php include.php >/dev/null; done

real    3m57.919s
user    2m37.040s
sys     1m16.780s

[email protected]:~$ time for i in `seq 10000`; do php readfile.php >/dev/null; done 
real    3m57.620s
user    2m38.400s
sys     1m14.100s

Заключение: все три практически эквивалентны для текстовых файлов на 12 Кбайт на PHP 5.2.4 с помощью Suhosin Patch.

Ответ 5

спасибо за подсказку, тем, кто любопытен

readfile();
<!-- dynamic page rendered in 0.133193016052 seconds.-->
<!-- static page rendered in 0.00292587280273 seconds.-->

против.

file_get_contents();
<!-- dynamic page rendered in 0.133193016052 seconds.-->
<!-- static page rendered in 0.00303602218628 seconds.-->

против.

include();
<!-- dynamic page rendered in 0.133193016052 seconds.-->
<!-- static page rendered in 0.00348496437073 seconds.-->

Ответ 6

file_get_contents будет самым быстрым способом получить кешированный файл по нескольким причинам:

  • Он не обрабатывает загружаемые данные (разбор кода PHP, обработка строк и т.д.).
  • Он использует оптимизированные методы для загрузки файлов как можно быстрее (файлы с отображением памяти для одного).