Mówi się dużo na temat tego, że file() jest wolniejszy od fgets(). Dodam również jedną inną funkcję - file_get_contents. Sprawdźmy :-).
Wszystko testowane: ab -c 60 -n 1000
Plik ma format:
Kod
c|x|a [nowa linia]
c|x|a [nowa linia]
...
Skrypt 1 (file):
<?php
//Otwarcie pliku - 10 tys. linii.
$plik = file(\"dane.txt\");
foreach($plik as $linijka)
{
}
?>
<b>Wyniki: </b>
Time taken for tests: 60.171875 seconds
Requests per second: 16.62 [#/sec] (mean)
Time per request: 3610.313 [ms] (mean)
Time per request: 60.172 [ms] (mean, across all concurrent requests)
Skrypt 2 (fgets):
<?php
//Otwarcie pliku - 10 tys. linii.
$plik = fopen(\"dane.txt\", \"rb\");
{
}
?>
Tryb rb - odczyt + binarny (funkcja file() jest binary safe).
<b>Wyniki: </b>
Time taken for tests: 69.531250 seconds
Requests per second: 14.38 [#/sec] (mean)
Time per request: 4171.875 [ms] (mean)
Time per request: 69.531 [ms] (mean, across all concurrent requests)
A więc <b> WOLNIEJ! </b>

:-).
Czas na file_get_contents. Będziemy dzielić wynik na linijki, żeby było sprawiedliwie.
Skrypt 3 (file_get_content):
<?php
//Otwarcie pliku - 10 tys. linii.
$plik = explode(\"n\", $plik);
foreach($plik as $linijka)
{
}
?>
<b>Wyniki:</b>
Time taken for tests: 61.656250 seconds
Requests per second: 16.22 [#/sec] (mean)
Time per request: 3699.375 [ms] (mean)
Time per request: 61.656 [ms] (mean, across all concurrent requests)
Minimalnie wolniejszy od file(), ale zawsze ;-).
A więc w tej konkurencji wygrał file()! Oczywiście jeśli chodzi nam o dostęp do każdej liniki z osobna. Następnym razem sprawdzimy jak się te funkcje sprawdzają przy odczycie całych plików + pakowania ich do jednej zmiennej (coś czuje że file_get_contents wygra ;-)).