2011-05-18 15 views
18

¿Por qué tengo que terminar usando la función fclose($handle) después de escribir en un archivo usando php? ¿El programa no hace esto automáticamente cuando termina?¿Por qué necesito `fclose` después de escribir en un archivo en PHP?

+11

Sí. PHP cierra automáticamente los identificadores de archivo al finalizar el script. En cualquier tipo de circunstancias en las que el script no termine inmediatamente después del archivo IO, sin embargo, es una buena idea cerrar el archivo. Por ejemplo, si escribe una biblioteca y esa biblioteca es utilizada por una secuencia de comandos CLI que llama a su función de biblioteca cientos de veces, es mejor cerrar el archivo después de cada llamada. –

+0

@Frank, que debería haber sido una respuesta para que pueda ser votado. :) – sarnold

Respuesta

12

Sí. Pero, es una buena práctica hacerlo tú mismo. Además, dejará el archivo abierto durante toda la ejecución del resto del script, lo cual debe evitar. Entonces, a menos que su script termine la ejecución directamente después de que haya terminado de escribir, básicamente está dejando el archivo abierto más de lo necesario.

+2

¿Es malo dejarlo abierto? ¿Cuáles son los inconvenientes de dejarlo abierto? – locoboy

+7

Está utilizando más memoria y es posible que otros procesos no puedan usar ese archivo. – dtbarne

+0

ah, buen punto en la memoria. así que cierra la memoria ... – locoboy

0

Excepto cuando el programa no termina o tarda mucho, cuenta hacia el máximo de archivos abiertos maneja en el sistema. Pero sí, PHP permite la pereza.

-2

Cuando se abre un archivo, se coloca un candado, lo que impide que otros procesos lo utilicen. fclose() elimina este bloqueo.

$handle no es un objeto, solo un puntero. Entonces no hay un destructor diciéndole que se desbloquee.

+0

Estoy un poco confundido con tus pronombres aquí. Cuando dice que se coloca un candado, ¿quiere decir que se coloca un candado en el archivo? Si es así, ¿qué tiene que ver el bloqueo con el uso de la función? ¿Qué hace la cerradura? – locoboy

+0

el bloqueo se coloca en un archivo. si está escribiendo en el archivo, y luego viene otro proceso e intenta escribir el archivo, se denegará el acceso porque dos cosas diferentes no pueden escribir en un archivo al mismo tiempo. el bloqueo impide que el segundo proceso pueda escribir. – zsalzbank

+0

así que esta es una razón por la que no importa, ¿verdad? Siempre que tenga diferentes nombres para sus punteros, no debería tener problemas para escribir múltiples archivos en el mismo programa. – locoboy

1

Sí, PHP normalmente cierra el archivo antes de salir. Pero siempre se debe cerrar de forma manual:

1- Es una buena práctica de programación

2- PHP puede cerrarse inesperadamente (por ejemplo, una excepción no detectada). Esto puede dejar el archivo con algo en la cola para escribir, o con un candado.

+2

Esperaría una excepción no detectada para limpiar los identificadores de archivo. Sin embargo, ciertamente he visto PHP segfault más de unas pocas veces, y no hay forma de que PHP pueda hacer ningún tipo de limpieza en esa situación –

0

No solo en PHP, en todos los idiomas debemos cerrar la secuencia cuando el trabajo está hecho. De esta forma, permitimos que otros usen ese archivo. Si no lo cerramos, es posible que otros programas no lo utilicen hasta que el programa finalice por completo (en este caso, en la página).

4

También hay implicaciones de seguridad a salir de descriptores de archivos abiertos: http://cwe.mitre.org/data/definitions/403.html

Su programa podría ejecutar un programa con diferentes niveles de privilegio, y un descriptor de archivo filtrado puede permitir que la información privada para cruzar una frontera entre los procesos de dos confianza diferente niveles:

http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914

Lo divertido con los errores de seguridad es que puede ser perfectamente seguro cuando se escribe la función inicial, pero uno o dos años después puede volverse inseguro debido a un cambio de apariencia inocente.

2

Puede haber datos no escritos en el búfer de salida que no se escriben hasta que se cierra el archivo. Si se produce un error en la escritura final, no se puede decir que la salida está incompleta, lo que puede causar todo tipo de problemas mucho más tarde.

Llamando explícitamente fclose()y comprobar su valor de retorno, usted tiene la oportunidad de:

  • Vuelva a intentar la operación
  • Desenrollar los cambios
  • devolver una condición de fallo a una función de llamada
  • Informe del problema al usuario
  • Documente el problema en un archivo de registro
  • Devuelve una indicación de falla al entorno de ejecución (como un shell de línea de comando) que puede ser crucial cuando se utiliza en una cadena de herramientas.

o de alguna otra manera que se adapte a su situación.

Esto se menciona en la sección de comentarios de fclose() manual page.

Cuestiones relacionadas