fopen

(PHP 3, PHP 4 , PHP 5)

fopen -- Apre un file o un URL

Descrizione

resource fopen ( string filename, string mode [, int use_include_path [, resource zcontext]])

La funzione fopen() apre un collegamneto tra una risorsa, indicata dal parametro filename, ed un flusso. Se il parametro filename Ŕ del tipo "scheme://...", si assume essere un URL ed il PHP cercherÓ il modulo di gestione del protocollo (detto anche wrapper) per quello schema. Se non vi sono wrapper registrati per il protocollo richiesto, il PHP genererÓ un messaggio per aiutare a trovare potenziali problemi nello script e quindi procede considerando filename come un file regolare.

Se il PHP ha stabilito che filename indica un file locale, tenterÓ di aprire detto file come stream. Il file in oggetto dovrÓ esere accessibile dal PHP, occorre, pertanto, assicurasi che i permessi di accesso del file lo consentano. Se si Ŕ attivato il safe mode, oppure open_basedir si avranno ulteriori restrizioni.

Se il PHP ha stabilito che filename indica un protocollo registrato, e che tale protocollo Ŕ registrato come un URL di rete, il PHP verificherÓ che allow_url_fopen sia abilitato.Se fosse disabilitato, il PHP genererÓ un 'notice' e la funzione fallirÓ.

Nota: L'elenco dei protocolli supportati si trova in Appendice L. Alcuni protocolli (indicati anche come wrappers) supportano il context e/o le opzioni del php.ini Fare riferimento alle pagine specifiche del protocollo per avere l'elenco delle opzioni che possono essere utilizzate. (Ad esempio il parametro del php.ini user_agent Ŕ utilizzato dal wrapper http) Per una descrizione del contexts e del zcontext, fare riferimento a Riferimento CVIII, Stream Functions.

Il parametro mode indica il tipo di accesso richiesto per il flusso. Esso pu˛ essere:

Tabella 1. Elenco dei possibili valori usati da fopen() per il parametro mode

modeDescrizione
'r' Apre in sola lettura; posiziona il puntatore all'inizio del file.
'r+' Apre in lettura e scrittura; posiziona il puntatore all'inizio del file.
'w' Apre il file in sola scrittura; posiziona il puntatore all'inizio del file e tronca il file alla lunghezza zero. Se il file non esiste, tenta di crearlo.
'w+' Apre in lettura e scrittura; posiziona il puntatore all'inizio del file e tronce il file alla lunghezza zero. Se il file non esiste, tenta di crearlo.
'a' Apre in sola scrittura; posiziona il puntatore alla fine del file. Se il file non esiste, tenta di crearlo.
'a+' Apre in lettura e scrittura; posiziona il puntatore alla fine del file. Se il file non esiste, tenta di crearlo.
'x' Crea ed apre il file in sola scrittura; posiziona il puntatore all'inizio del file. Se il file esiste giÓ la chiamata a fopen() fallirÓ restituendo FALSE e verrÓ generato un errore di lievllo E_WARNING. Se il file non esiste si tenterÓ di crearlo. Questo equivale a specificare i flag O_EXCL|O_CREAT nella sottostante chiamata a open(2) . Questa opzione Ŕ supportata a partire dalla versione 4.3.2 di PHP, e funziona solo con i file locali.
'x+' Crea ed apre il file in lettura e scrittura; posiziona il puntatore all'inizio del file. Se il file esiste giÓ la chiamata a fopen() fallirÓ restituendo FALSE e verrÓ generato un errore di lievllo E_WARNING. Se il file non esiste si tenterÓ di crearlo. Questo equivale a specificare i flag O_EXCL|O_CREAT nella sottostante chiamata a open(2) . Questa opzione Ŕ supportata a partire dalla versione 4.3.2 di PHP, e funziona solo con i file locali.

Nota: Differenti famiglie di file system hanno differenti tipi di terminatori di riga. Quando si scrive un file di testo e si desidera inserire una interruzione di linea, occorre utilizzare il terminatore appropriato per il sistema operativo utilizzato. I sistemi basati su Unix utilizzano \n come terminatore di riga, i sistemi basati su Windows utilizzano \r\n mentre i sistemi Macintosh utilizzano \r.

Se si utilizza un errato terminatore di riga quando si scrivono i file, si pu˛ verificare che altre applicazioni accedendo a questi file abbiano comportamenti bizzarri.

Windows ha un flag di traduzione della modalitÓ testo ('t') che in modo trasparente converte \n in \r\n mentre si lavora sul file. Ovviamente si ha anche il flag 'b' per forzare una modalitÓ binaria, nella quale non si ha la conversione dei dati. Se si usano questi flag, 'b' oppure 't', devono essere posizionati come ultimo carattere del parametro mode.

La modalitÓ di conversione di default dipende dalla SAPI e dalla versione di PHP che si sta utlizzando, pertanto si incoraggia l'uso dei flag appropriati per aumentare la portabilitÓ degli script. Si dovrebbe utilizzare 't' se si lavora con dei file di testo, e si utilizza \n per indicare il fine linea, e ci si aspetta che che altre applicazioni, tipo notepad, leggano il file prodotto. In tutti gli altri casi si dovrebbe utilizzare 'b'

Se non si specifica il flag 'b' quando si lavora con file binari, si possono avere situazioni anomale nei dati, tipo immagini corrotte, e situazioni anomale con i caratteri \r\n.

Per motivi di portabilitÓ Ŕ fortemente raccomandato l'uso del flag 'b' quando si aprono dei file con fopen().

Inoltre, sempre per la portabilitÓ, Ŕ anche fortemente raccomandato di aggiornare il codice che utilizza o che confida nel modalitÓ 't' in modo da utilizzare il corretto terminatore di linea.

A partire dal PHP 4.3.2, per tutte le piattaforme che distinguono tra tra testo e binario, la modalitÓ di default Ŕ la binaria. Se si hanno problemi negli script dopo l'aggiornamneto, tentare l'utilizzo del flag 't' per tamponare i problemi fino a quando non si sono resi gli script pi¨ portabili come descritto in precedenza.

Il terzo parametro opzionale use_include_path pu˛ essere impostato a '1' oppure a TRUE se si desidera cercare il file in include_path.

Se la open fallisce, la funzione restituisce FALSE e viene generato un errore di tipo E_WARNING. Si pu˛ utilizzare @ per sopprimere questo warning.

Esempio 1. Esempi di fopen()

<?php
$handle
= fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>

Se si dovessero manifestare dei problemi nella lettura o scrittura di file e si sta utilizzando la versione server di PHP, occorre verificare che i file e le directory utilizzate dallo script siano accessibili dal processo del server.

Sulla piattaforma Windows occorre prestare attenzione ai backslash nei percorsi dei file; questi devono essere preceduti dal caratteri di escape '\', oppure utilizzare lo slash '/'.

<?php
$handle
= fopen("c:\\data\\info.txt", "r");
?>

Nota: Quando safe-mode Ŕ abilitato, PHP controlla che la directory nella quale si sta lavorando, abbia lo stesso UID dello script che Ŕ in esecuzione.

Vedere anche Appendice L, fclose(), fgets(), fread(), fwrite(), fsockopen(), file(), file_exists(), is_readable(), stream_set_timeout() e popen().