2011-01-31 28 views
25

Dołączam plik custom.css do mojego szablonu, aby umożliwić właścicielom witryn dodawanie własnych reguł css. Jednak kiedy wysyłam plik, jego zawartość jest pusta i nie ma sensu ładowanie go, jeśli nie dodali do niego żadnych reguł.Najlepszy sposób na sprawdzenie, czy plik jest pusty (php)?

Jaki jest najlepszy sposób określenia, czy jest pusty?

if (0 == filesize($file_path)) 
{ 
    // file is empty 
} 

// OR: 

if ('' == file_get_contents($file_path)) 
{ 
    // file is empty 
} 

Odpowiedz

41

file_get_contents() odczyta cały plik podczas filesize() wykorzystuje stat() do detirmine rozmiar pliku. Użyj filesize(), powinien zużywać mniej operacji we/wy dysku.

+6

... i zużywają znacznie mniej pamięci – symcbean

+1

tylko chcę zwrócić uwagę, że jeśli plik jest zmiana połączenia clearstatcache() przed wywołanie filesize() lub otrzymasz wyniki z pamięci podręcznej. To mi się przydarzyło. – Firze

+0

To zadziałało dla mnie. Zwraca 0, jeśli plik jest pusty. –

8

Używanie filesize() jest wyraźnie lepsza. Używa ona stat(), która nie musi w ogóle otwierać pliku.

file_get_contents() czyta cały plik. Wyobraź sobie, co się stanie, jeśli masz plik o pojemności 10 GB.

+4

Wyobraź sobie, ile czasu zajmie Twoja witryna, aby załadować plik CSS o pojemności 10 GB: P – alex

+1

Wyobrażam sobie, po dalszych myślach, prawdopodobnie zaszkodzi po prostu załadowanie pustego css, niż zmierzenie się z testowaniem, czy jest pusty, aby uniknąć ładowania. –

+0

Dla małych plików (nie przeczytałem części CSS) nie ma to znaczenia. filesize() jest jeszcze szybszy i znacznie lepszy - dlaczego chciałbyś odczytać zawartość pliku z twardego dysku, jeśli i-węzeł (lub nawet pamięć podręczna systemu plików lub wewnętrzny bufor statystyk PHP) zawiera wszystkie potrzebne informacje. – ThiefMaster

4

filesize() będzie bardziej wydajny, ale może wprowadzać w błąd. Gdyby ktoś miał tam tylko komentarze lub tylko białe spacje, zwiększyłoby to rozmiar pliku. IMO powinieneś zamiast tego szukać czegoś konkretnego w pliku, na przykład /* enabled=true */ w pierwszej linii, a następnie użyć fopen/fread, aby przeczytać pierwszą linię. Jeśli go tam nie ma, nie ładuj go.

+0

nic złego, jednak w fałszywym wyniku.ta kontrola nie jest tak ważna, –

+1

prawda ... ale nie jest też wielką sprawą, aby po prostu załadować plik, jeśli jest pusty. Mówię tylko ... jeśli masz zamiar niszczyć i wymyślić coś w rodzaju ładowania pustego pliku, równie dobrze możesz to zliczyć jako "ważne" –

1

Jak wspomniano w innych odpowiedziach, filesize jest sposobem, aby przejść dla plików lokalnych. Z drugiej strony wiele wrapperów strumieniowych, w tym HTTP, ma , a nie ma wsparcie , a więc filesize zakończy się niepowodzeniem, natomiast file_get_contents zadziała.

4

Każdy powinien zachować ostrożność podczas korzystania z filesize, ponieważ jego wyniki są buforowane dla lepszej wydajności. Więc jeśli potrzebujesz lepszą precyzję, zaleca się użyć czegoś takiego:

<? 
clearstatcache(); 
if(filesize($path_to_your_file)) { 
    // your file is not empty 
} 

More info here

+1

To nie zadziała, ponieważ instrukcja wyraźnie stwierdza, że ​​parametr 'filesize' musi być ciąg znaków. 'fopen' zwraca zasób. – Nicero

+0

@ Nerero, dzięki, masz rację. Edytowałem kod. – userlond

Powiązane problemy