file_get_contents медленнее, чем включают?

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

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

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

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

существует ли лучший способ вытянуть в моих файлах кэша без увольнения shorttags?

16
задан David Morrow 24 February 2010 в 18:04
поделиться

6 ответов

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

12
ответ дан 30 November 2019 в 15:06
поделиться

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

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

vinko@parrot:~$ 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:

vinko@parrot:~$ more file_get_contents.php
<?php
echo file_get_contents("test.txt");
?>

include.php

vinko@parrot:~$ more include.php
<?php
include("test.txt");
?>

readfile.php

vinko@parrot:~$ more readfile.php
<?php
readfile("test.txt");
?>

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

vinko@parrot:~$ time for i in `seq 10000`; do php file_get_contents.php >/dev/null; done

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

vinko@parrot:~$ time for i in `seq 10000`; do php include.php >/dev/null; done

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

vinko@parrot:~$ 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.

11
ответ дан 30 November 2019 в 15:06
поделиться

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

Со страницы руководства :

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

Однако, если вы выводите файл после вывода, а не превращаете его в строку, readfile () даже немного быстрее, чем file_get_contents . Учитывая, что include 'также будет выводить любое содержимое, отличное от 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
36
ответ дан 30 November 2019 в 15:06
поделиться

file_get_contents и включают не сделайте то же самое:

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

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

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

11
ответ дан 30 November 2019 в 15:06
поделиться

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

  1. Он не выполняет никакой обработки загружаемых данных (анализ PHP-кода, обработка новой строки и т. Д.)
  2. Он использует оптимизированные методы для загрузки файлы как можно быстрее (файлы с отображением памяти для одного).
1
ответ дан 30 November 2019 в 15:06
поделиться

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

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

vs.

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

vs.

include();
<!-- dynamic page rendered in 0.133193016052 seconds.-->
<!-- static page rendered in 0.00348496437073 seconds.-->
6
ответ дан 30 November 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: