(PHP 4, PHP 5, PHP 7, PHP 8)
fopen — Apre un file o un URL
$filename
,$mode
,$use_include_path
= false
,$context
= ?
La funzione fopen() apre un collegamento tra una risorsa, indicata
dal parametro filename
, ed un flusso.
filename
Se il parametro filename
è nella forma "scheme://...",
si assume che sia un URL e PHP cercherà il modulo di gestione del protocollo
(detto anche wrapper) per quello schema. Se non vi sono wrapper
registrati per il protocollo richiesto, PHP genererà un messaggio per aiutare a trovare
potenziali problemi nello script e quindi procede considerando
filename
come un file normale.
Se PHP ha stabilito che filename
indica
un file locale, tenterà di aprire detto file come stream.
Il file in oggetto dovrà esere accessibile a PHP, occorre, pertanto, assicurarsi che
i permessi di accesso del file lo consentano.
Se si è attivato
open_basedir potrebbero
essere applicate ulteriori restrizioni.
Se PHP ha stabilito che filename
indica
un protocollo registrato, e che tale protocollo è registrato come un
URL di rete, PHP verificherà che
allow_url_fopen sia
abilitato. Se fosse disabilitato, PHP genererà un avviso e
la chiamata ad fopen fallirà.
Nota:
L'elenco dei protocolli supportati si trova in Supported Protocols and Wrappers. Alcuni protocolli (indicati anche come
wrappers
) supportano ilcontext
e/o le opzioni del php.ini. Fare riferimento alla pagina specifica del protocollo in uso per avere l'elenco delle opzioni che possono essere utilizzate. (Ad esempio il valore diuser_agent
del php.ini è utilizzato dal wrapperhttp
).
Sulla piattaforma Windows, fare attenzione effettuando l'escape dei backslash usati nel percorso del file, o utilizzare gli slash.
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
mode
Il parametro mode
indica il tipo di accesso
richiesto per il flusso. Esso può essere uno dei seguenti:
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 tronca 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. In questa modalità, fseek() non ha effetto, le scritture vengono sempre aggiunte alla fine. |
'a+' |
Apre in lettura e scrittura; posiziona il puntatore alla fine del file. Se il file non esiste, tenta di crearlo. In questa modalità fseek() influisce solo sulla posizione di lettura, le scritture vengono sempre aggiunte alla fine. |
'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 livello E_WARNING . Se
il file non esiste, si tenterà di crearlo. Questo equivale
a specificare i flag O_EXCL|O_CREAT nella
sottostante chiamata di sistema a open(2) .
|
'x+' |
Crea ed apre il file in lettura e scrittura; per il resto ha lo
stesso comportamento di 'x' .
|
'c' |
Apre il file in sola scrittura. Se il file non esiste, viene
creato. Se esiste, non viene né troncato (al contrario di
'w' ), né la chiamata a questa funzione fallisce (come
nel caso di 'x' ). Il puntatore del file è
posizionato all'inizio del file. Questo può essere utile se si
desidera ottenere un advisory lock (vedere flock())
prima di tentare di modificare il file, poiché l'utilizzo di
'w' potrebbe troncare il file prima che il lock
venga ottenuto (se si desidera troncare,
può essere usata ftruncate()dopo che il lock viene
richiesto).
|
'c+' |
Apre il file in lettura e scrittura; per il resto ha lo stesso
comportamento di 'c' .
|
'e' |
Imposta il flag close-on-exec sul descrittore del file aperto. Disponibile solo per PHP compilato su sistemi conformi a POSIX.1-2008. |
Nota:
Differenti famiglie di file system hanno differenti convenzioni 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 (Mac OS Classic) utilizzano\r
.Se si utilizza un errato terminatore di riga quando si scrivono i file, si può verificare che altre applicazioni che aprono questi file abbiano "comportamenti bizzarri".
Windows offre un flag di traduzione della modalità testo (
't'
) che in modo trasparente converte\n
in\r\n
mentre si lavora sul file. In contrasto, si può anche usare il flag'b'
per forzare una modalità binaria, nella quale non si ha la conversione dei dati. Per usare questi flag,'b'
oppure't'
, devono essere posizionati come ultimo carattere del parametromode
.La modalità di conversione di default è
'b'
. Si può usare la modalità't'
se si lavora con dei file di testo e si utilizza\n
per indicare il fine linea negli script, ma ci si aspetta che applicazioni, tipo vecchie versioni di notepad, leggano i file prodotti. 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à, è fortemente raccomandato di riscrivere il codice che utilizza o che si avvale del mode
't'
, così da utilizzare il corretto terminatore di linea invece del'b'
mode.
use_include_path
Il terzo parametro opzionale use_include_path
può essere impostato a '1' oppure a true
se si desidera cercare il file anche
in include_path.
context
Nota: Il supporto per il contesto è stato aggiunto in PHP 5.0.0. Per la descrizione del
contesto
, fare riferimento a Stream Funzioni.
Restituisce una risorsa puntatore a file in caso di successo,
o false
in caso di fallimento
In caso di errore, viene inviato un E_WARNING
.
Versione | Descrizione |
---|---|
7.0.16, 7.1.2 |
È stata aggiunta l'opzione 'e' .
|
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:password@example.com/somefile.txt", "w");
?>
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:
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.
Nota:
Questa funzione può anche avere successo quando
filename
è una directory. Se non si è sicuri chefilename
sia un file o una directory, potrebbe essere necessario utilizzare la funzione is_dir() prima di chiamare fopen().