Içerir daha file_get_contents yavaş mı?

6 Cevap php

have a file caching system for a php 5 library i use often. when the request is made i check for a cached file, if there is one i render it and exit.

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

i nedeniyle sinir bozucu önbelleğe xml dosyaları file_get_contents yerine sadece eklemek yapmak zorunda

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

shorttags ateş olmadan benim önbellek dosyaları çekmek için daha iyi bir yolu var mı?

6 Cevap

Eğer yapmak istediğiniz tüm dosya içeriği çıktı ise,) (readfile kullanıyor olmalıdır. Bu file_get_contents daha yoğun, daha hızlı ve daha az bellek ()

include, örneğin, dosyaların içeriğini değerlendirecek yana PHP tercüman aracılığıyla çalıştırılır ve ayrıca dosyaları bulmak için include_path kullanın, ben include daha yavaş olduğunu söyleyebilirim. file_get_contents sadece dize olarak bir dosyanın içeriğini tedavi edecek. Daha az yük, daha fazla hız.

Kimden manual page:

file_get_contents () bir dizeye bir dosyanın içeriğini okumak için tercih edilen yoldur. Performansını artırmak için işletim sistemi tarafından destekleniyorsa bellek haritalama teknikleri kullanacağız.

Ancak, bunun yerine bir dize içine alma, dosya çıktısı sonra ise, readfile() is even a tiny bit faster than file_get_contents. Sanırım sonra include 'de çıktısı olmayan herhangi bir PHP içerik ing, bu büyük olasılıkla daha büyük olasılıkla ne olduğu göz önüne alındığında.

Masaüstü makinede Revize kriter:

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

ve

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

ve

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

Sonuç

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

file_get_contents ve include aynı şeyi yapmaz:

  • file_get_contents, bir dosyanın içeriğini okur ve bir dize olarak döndürür
  • include dosyasının içeriğini yürütecek.

Hızı hakkında, bir opcode önbellek olmadan, ben daha az hesaplama (no compilation/execution of the code) yaptığı gibi file_get_contents teorik, daha hızlı olmalı herhalde.

Sadece bir dosya okumak istiyorsanız, file_get_contents kullanmalısınız: Yine, ne en yapmak için çalışıyoruz ne muhtemelen önemli.

Hiçbir şey (Ben bir şey bakan olabilir, göründüğünden daha zor) bir (iyi yapılmış) kriter yener. Her ikisi de aynı koşullarda yapılır gibi hala bir ölçüm çubuğu olarak hizmet etmelidir.

test.txt bir 12kB, 876 satır metin dosyasıdır:

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");
?>

Yani, her 10 bin yineleme yürütme zamanı:

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

Sonuç: Her üç Suhosin Patch ile PHP 5.2.4 'ten 12 kB metin dosyaları için neredeyse eşdeğerdir.

merak edenler için ipucu için teşekkürler,

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.-->

file_get_contents bir kaç nedenden dolayı önbelleğe alınmış dosya almak için en hızlı yol olacaktır:

  1. It (vb satırsonlarını taşıma, PHP kodu ayrıştırma) veriler yükler üzerinde işlem gerçekleştiren
  2. Mümkün (hafıza biri için dosyaları eşleştirilmiş) kadar hızlı dosyalarını yüklemek için optimize teknikleri kullanır.