2011-01-31 17 views
25

Incluyo un archivo custom.css en mi plantilla para permitir que los propietarios de sitios añadan sus propias reglas CSS. Sin embargo, cuando envío el archivo, está vacío y no tiene sentido cargarlo si no le han agregado reglas.¿La mejor manera de determinar si un archivo está vacío (php)?

¿Cuál es la mejor manera de determinar si está vacío?

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

// OR: 

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

Respuesta

41

file_get_contents() leerá el archivo completo, mientras que filesize() utiliza stat() a detirmine el tamaño del archivo. Use filesize(), debería consumir menos E/S de disco.

+6

... y consumen mucha menos memoria – symcbean

+1

Sólo quiero señalar que si el archivo está cambiando clearstatcache llamada() antes llamando a filesize() o obtendrá resultados almacenados en caché. Esto me pasó a mí. – Firze

+0

Esto funcionó para mí. Devuelve 0 si el archivo está vacío. –

8

El uso de filesize() es claramente mejor. Utiliza stat() que no tiene que abrir el archivo en absoluto.

file_get_contents() lee todo el archivo ... imagine lo que sucede si tiene un archivo de 10 GB.

+4

Imagínese cuánto tardaría su sitio en cargar con un archivo CSS de 10GB: P – alex

+1

Me imagino que, después de pensarlo más, probablemente haya menos daño al cargar un css vacío que tomarse la molestia de probar si está vacío para evitar cargarlo. –

+0

Para archivos pequeños (no he leído la parte de CSS) realmente no importa. filesize() es aún más rápido y mucho mejor: ¿por qué querrías leer el contenido del archivo desde el disco duro si el inodo (o incluso el caché del sistema de archivos o el stat-cache interno de PHP) contiene toda la información que necesitas? – ThiefMaster

4

filesize() sería más eficiente, sin embargo, podría ser engañoso. Si alguien tuviera solo comentarios allí o incluso solo espacios en blanco ... aumentaría el tamaño del archivo. OMI, en su lugar, debe buscar algo específico en el archivo, como /* enabled=true */ en la primera línea y luego usar fopen/fread para leer la primera línea. Si no está allí, no lo cargue.

+0

nada malo, sin embargo, en falso resultado.este cheque no es tan importante –

+1

verdadero ... pero tampoco es un gran problema cargar el archivo solo si está vacío. Solo digo ... si va a costar algo así como cargar un archivo vacío, también puede contar esto como "importante" –

1

Como se menciona en otras respuestas, filesize es el camino a seguir para los archivos locales. Muchas envolturas de flujo, por otro lado, incluido HTTP, do no tienen soporte stat(), por lo que filesize fallarán, mientras que file_get_contents funcionarán.

4

Todo el mundo tenga cuidado al utilizar filesize, porque sus resultados se almacenan en caché para un mejor rendimiento. Así que si necesita una mayor precisión, se recomienda usar algo como:

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

More info here

+1

Esto no funcionará porque el manual establece explícitamente que el parámetro 'tamaño de archivo' debe ser una cuerda. 'fopen' devuelve un recurso. – Nicero

+0

@Nicero, gracias, tienes razón. He editado el código. – userlond

Cuestiones relacionadas