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