Является ли file_get_contents медленнее, чем include? - PullRequest
15 голосов
/ 24 февраля 2010

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

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

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

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

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

Ответы [ 6 ]

35 голосов
/ 24 февраля 2010

Поскольку 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
11 голосов
/ 24 февраля 2010

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

11 голосов
/ 24 февраля 2010

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

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 голосов
/ 24 февраля 2010

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

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

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

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

6 голосов
/ 24 февраля 2010

спасибо за совет, для любознательных

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.-->
1 голос
/ 24 февраля 2010

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

  1. Он не выполняет обработку загружаемых данных (синтаксический анализ PHP-кода, обработку строк и т. Д.)
  2. Используются оптимизированные методы для максимально быстрой загрузки файлов (файлы с отображением в памяти для одного).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...