(PHP 4, PHP 5)
fopen — Apre un file o un URL
$filename
, string $mode
[, bool $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 modalità sicura,
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 Supported Protocols and Wrappers. 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 Stream Funzioni.
Nota: Il supporto per il contesto è stato aggiunto in PHP 5.0.0. Per la descrizione del contesto, fare riferimento a Stream Funzioni.
Nota: Come per PHP 4.3.2, la modalità di default è impostata a binarioper tutte le piattaforme che distinguono tra modalità binaria e testuale. Se si hanno problemi con i propri script dopo l'aggiornamento, provare a utilizzare il flag 't' come sostitutivo finchè si ha completato uno script maggiormente portabile come richiesto sopra.
Il parametro mode
indica il tipo di accesso
richiesto per il flusso. Esso può essere:
mode |
Descrizione |
---|---|
'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.
Nota:
Per la portabilità, si consiglia vivamente di usare sempre il flag 'b' quando si aprono files con fopen().
Nota:
Inoltre, sempre per la portabilità, è anche fortemente raccomandato di aggiornare il codice che utilizza o che si avvale del mode 't' così da utilizzare il corretto terminatore di linea invece del 'b' mode.
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.
Example #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:[email protected]/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");
?>
Quando si usa SSL, Microsoft IIS viola il protocollo chiudendo la connessione senza inviare un'indicazione close_notify. PHP indicherà questo con un "SSL: Fatal Protocol Error" al raggiungimento della fine dei dati. Per aggirare questo problema, occorre abbassare il livello error_reporting per non includere questi avvisi. PHP 4.3.7 e successivi sono in grado di identificare gli IIS bacati quando si apre lo stream utilizzando il wrapper https:// e disabilitano automaticamente l'avviso. Se si usa fsockopen() per creare un socket ssl://, occorre identificare e sopprimere l'avviso manualmente.
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 Supported Protocols and Wrappers, fclose(), fgets(), fread(), fwrite(), fsockopen(), file(), file_exists(), is_readable(), stream_set_timeout() e popen().