¿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?
Respuesta
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.
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.
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.
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
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
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
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.
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 –
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).
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.
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.
- 1. ¿Cómo escribir en un archivo en PHP?
- 2. Necesito escribir al comienzo del archivo con PHP
- 3. php fwrite() no termina de escribir datos de cadena en un archivo, ¿por qué?
- 4. ¿Escribir un archivo .htaccess en PHP?
- 5. Después de escribir en un archivo, ¿por qué os.path.getsize aún devuelve el tamaño anterior?
- 6. ¿Cómo ver un archivo escribir en PHP?
- 7. Permanentemente escribir variables en un archivo php con php
- 8. ¿Por qué Apache + PHP requiere permisos de ejecución para escribir en un archivo?
- 9. ¿Por qué necesito la función isset() en php?
- 10. ¿Por qué necesito usar un marco popular?
- 11. ¿Cómo escribir una cadena en un archivo en C?
- 12. ¿Por qué escribir en un descriptor de archivo después de que el archivo de destino haya sido eliminado?
- 13. Necesito escribir en un archivo usando fopen en una clase C++ para el proyecto iOS
- 14. ¿Por qué necesito un archivo * .obj al vincular estáticamente?
- 15. Escribir datos de publicaciones en un archivo con PHP
- 16. ¿Por qué (y cuándo) necesito usar paréntesis después de sizeof?
- 17. ¿Por qué compilar un archivo PHP?
- 18. crear archivo ini, escribir valores en PHP
- 19. ¿qué idioma necesito para escribir macros en LIbre Office Calc?
- 20. ¿Qué escribir en el archivo de registro?
- 21. ¿Por qué escribir en un MemoryStream es más lento que en un archivo?
- 22. ¿Cómo escribir php + html en un archivo más bonito?
- 23. Escribir una coma en un archivo CSV con PHP
- 24. la lectura de un archivo de matriz asociativa en php
- 25. ¿Por qué/cuándo necesito un objetivo "limpio"?
- 26. cómo escribir en un archivo en emacs
- 27. Mercurial: ¿Por qué a veces necesito fusionarme después de una extracción en lugar de simplemente actualizar?
- 28. ¿Cómo escribir un flujo en un archivo?
- 29. fclose return value check
- 30. PHP para escribir caracteres de tabulación dentro de un archivo?
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. –
@Frank, que debería haber sido una respuesta para que pueda ser votado. :) – sarnold