Gracias al sistema de conteo de referencias introducido con PHP de 4 Zend Engine, un recurso sin más referencias a él se detecta automáticamente y se libera por la basura coleccionista.
Considere las implicaciones de esto. Es seguro suponer que todos los rastros de la variable se han ido después de la recolección de basura. En otras palabras, al final de la ejecución de PHP, si PHP aún no sigue la referencia, ¿cómo lo cerraría? Por lo tanto, parece bastante lógico que lo cerraría cuando el recolector de basura lo come.
Sin embargo, este es un argumento lógico incorrecto porque supone que las recolecciones de basura ocurren inmediatamente o poco después de la desinstalación y que PHP no mantiene referencias ocultas a las variables que ya no existen en el terreno del usuario.
Un caso más convincente, aunque podría ser un defecto de comportamiento potencial si PHP no se cerró identificadores de archivo cuando salen del ámbito de aplicación. Considera un daemon de algún tipo que abre muchos archivos.Ahora considere si fclose nunca se llama. En su lugar, se permite que las variables caigan fuera del alcance o se llame explícitamente a las variables.
Si estos identificadores de archivo no se cerraron, este daemon de ejecución larga se quedaría sin controladores de archivo.
Potencialmente comportamiento escritura de la prueba específica:
<?php
$db = mysql_connect(...);
if ($db) {
echo "Connected\n";
sleep(5); //netstat during this just for paranoia
unset($db);
echo "Unset\n";
sleep(5); //netstat during this and the connection is closed
}
tanto en Windows 7 y Debian 6, la conexión se ha cerrado después del desarmado.
Obviamente, sin embargo, esto solo prueba que en mis máquinas específicas con mi versión específica de PHP funcionará esto. No tiene sentido en los manejadores de archivos o similares :).
Am buscar la fuente de PHP ahora para una prueba dura
yo no confiaría en que funcione constantemente a través de los sistemas operativos (sólo un presentimiento, aunque, no tengo evidencia de cualquier manera) –
Sólo por curiosidad: ¿Cuál es la razón por la que elegirías 'unset' encima de' fclose'? – Nanne
Pekka tiene razón, probé 'echo '$ fp es resource ='. (Is_resource ($ fp)? 'True': 'false');' Devuelve falso en máquina W2K, y en otros devuelve true – Sanjay