Grazie al sistema di riferimento conteggio introdotta con PHP 4 Zend Engine, una risorsa con altri riferimenti ad esso viene rilevato automaticamente e viene liberato dalla spazzatura collettore.
Considerare le implicazioni di questo. È sicuro presumere che tutte le tracce della variabile siano scomparse dopo la garbage collection. In altre parole, alla fine dell'esecuzione di PHP, se PHP non sta ancora monitorando il riferimento, come lo chiuderà? Quindi, sembra abbastanza logico che lo chiuda quando il garbage collector lo mangia.
Questo è un argomento logico errato perché presuppone che le raccolte di dati inutili avvengano immediatamente o poco dopo l'eliminazione e che PHP non mantenga riferimenti nascosti a variabili che non esistono più nella terra dell'utente.
Un caso più convincente anche se potrebbe essere un potenziale difetto comportamentale se PHP non vicino handle di file quando vanno fuori portata. Considera un demone di qualche tipo che apre molti file.Considerare ora se fclose non viene mai chiamato. Invece, le variabili possono uscire dal campo di applicazione o unset viene esplicitamente richiamato su di esse.
Se questi handle di file non sono stati chiusi, questo daemon a esecuzione prolungata non ha più handle di file.
Potenzialmente comportamento specifico script di test:
<?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
}
Su Windows 7 e Debian 6, la connessione è stata chiusa dopo il disinserimento.
Ovviamente, tuttavia, questo dimostra che sui miei computer specifici con la mia versione PHP specifica funzionerà. Non ha alcun significato sugli handle di file o simili :).
Cerco la sorgente PHP ora dura prova
io non mi fiderei a farlo funzionare in modo coerente in tutta sistemi operativi (solo una sensazione viscerale anche se, non ho prove in entrambi i casi) –
Solo curioso: qual è la ragione per cui sceglieresti 'unset' sopra' fclose'? – Nanne
Pekka ha ragione, ho provato 'echo '$ fp è resource ='. (Is_resource ($ fp)? 'True': 'false');' Restituisce false sulla macchina W2K e in altri restituisce true – Sanjay