имейте систему кэширования файлов для библиотеки php 5, которую я часто использую. когда запрос выполнен, я проверяю на кэшируемый файл, если существует тот, который я представляю его и выход.
$contents = file_get_contents( self::_cacheFile() );
echo $contents;
exit();
я должен сделать, file_get_contents вместо просто включают из-за кэшируемых XML-файлов с противным
`<?xml version="1.0"?>`
существует ли лучший способ вытянуть в моих файлах кэша без увольнения shorttags?
Если все, что вы хотите сделать, это вывести содержимое файла, вам следует использовать readfile(). Это быстрее и требует меньше памяти, чем file_get_contents()
Ничто не сравнится с (хорошо сделанным) тестом (который сложнее, чем кажется, я могу что-то упустить). Тем не менее, поскольку оба изготовлены в одинаковых условиях, они должны служить мерой.
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.
Поскольку 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
file_get_contents
и включают
не сделайте то же самое:
file_get_contents
считывает содержимое файла и возвращает его в виде строки include
выполнит содержимое файла. Что касается скорости, без кеша опкодов, я полагаю, file_get_contents
теоретически должен быть быстрее, так как он требует меньше вычислений (без компиляции / выполнения кода) .
Тем не менее, наиболее важно, вероятно, то, что вы пытаетесь сделать: если вы хотите только прочитать файл, вы должны использовать file_get_contents
.
file_get_contents - это самый быстрый способ получить кэшированный файл по двум причинам:
спасибо за подсказку, любопытным
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.-->