(PHP 4, PHP 5, PHP 7)
fopen — Abre un fichero o un URL
$filename
, string $mode
[, bool $use_include_path
= FALSE
[, resource $context
]] ) : resource
fopen() asocia un recurso con nombre, especificado por
filename
, a un flujo.
filename
Si filename
está en la forma "esquema://...", se
asume que será un URL y PHP buscará un gestor de protocolos
(también conocido como envoltura) para ese protocolo. Si no está registrada
ninguna envoltura para ese protocolo, PHP emitirá un aviso para ayudar a rastrear
problemas potenciales en el script y continuará como si
filename
especificara un fichero normal.
Si PHP ha decidido que filename
especifica
un fichero local, intentará abrir un flujo para ese fichero.
El fichero debe ser accesible para PHP, por lo que es necesario asegurarse de que
los permisos de acceso del fichero permiten este acceso.
Si está habilitado el modo seguro
o open_basedir se pueden aplicar
más restricciones.
Si PHP ha decidido que filename
especifica
un protocolo registrado, y ese protocolo está registrado como un
URL de red, PHP se asegurará de que
allow_url_fopen está
habilitado. Si es desactivado, PHP emitirá un aviso y
la llamada a fopen fallará.
Nota:
La lista de protocolos soportados se puede encontrar en Protocolos y Envolturas soportados. Algunos protocolos (también descritos como envolturas) soportan contexto y/u opciones de php.ini. Consulte la página específica del protocolo en uso para una lista de opciones que se pueden establecer. (p.ej. el valor user_agent en php.ini usado por la envoltura http).
En la plataforma Windows, asegúrese de escapar cualquier barra invertida usada en la ruta de fichero, o use barras hacia delante.
<?php
$gestor = fopen("c:\\folder\\resource.txt", "r");
?>
mode
El parámetro mode
especifica el tipo de acceso
que se necesita para el flujo. Puede ser cualquiera de los siguientes:
mode |
Descripción |
---|---|
'r' | Apertura para sólo lectura; coloca el puntero al fichero al principio del fichero. |
'r+' | Apertura para lectura y escritura; coloca el puntero al fichero al principio del fichero. |
'w' | Apertura para sólo escritura; coloca el puntero al fichero al principio del fichero y trunca el fichero a longitud cero. Si el fichero no existe se intenta crear. |
'w+' | Apertura para lectura y escritura; coloca el puntero al fichero al principio del fichero y trunca el fichero a longitud cero. Si el fichero no existe se intenta crear. |
'a' | Apertura para sólo escritura; coloca el puntero del fichero al final del mismo. Si el fichero no existe, se intenta crear. En este modo, fseek() solamente afecta a la posición de lectura; las lecturas siempre son pospuestas. |
'a+' | Apertura para lectura y escritura; coloca el puntero del fichero al final del mismo. Si el fichero no existe, se intenta crear. En este modo, fseek() no tiene efecto, las escrituras siempre son pospuestas. |
'x' |
Creación y apertura para sólo escritura; coloca el puntero del fichero al
principio del mismo. Si el fichero ya existe, la
llamada a fopen() fallará devolviendo FALSE y
generando un error de nivel E_WARNING . Si
el fichero no existe se intenta crear. Esto es equivalente
a especificar las banderas O_EXCL|O_CREAT para la
llamada al sistema de open(2) subyacente.
|
'x+' | Creación y apertura para lectura y escritura; de otro modo tiene el mismo comportamiento que 'x'. |
'c' | Abrir el fichero para sólo escritura. Si el fichero no existe, se crea. Si existe no es truncado (a diferencia de 'w'), ni la llamada a esta función falla (como en el caso con 'x'). El puntero al fichero se posiciona en el principio del fichero. Esto puede ser útil si se desea obtener un bloqueo asistido (véase flock()) antes de intentar modificar el fichero, ya que al usar 'w' se podría truncar el fichero antes de haber obtenido el bloqueo (si se desea truncar el fichero, se puede usar ftruncate() después de solicitar el bloqueo). |
'c+' | Abrir el fichero para lectura y escritura; de otro modo tiene el mismo comportamiento que 'c'. |
'e' | Establecer la bandera 'close-on-exec' en el descriptor de fichero abierto. Disponible solamente en PHP compilado en sistemas que se ajustan a POSIX.1-2008. |
Nota:
Diferentes familias de sistemas operativos tienen diferentes convenciones para el final de línea. Cuando escribe un fichero de texto y quiere insertar un salto de línea, necesita usar el carácter o caracteres correctos de final de línea para su sistema operativo. Los sistemas basados en Unix usan \n como el carácter de final de línea, los sistemas basados en Windows usan \r\n como caracteres de final de línea y los sistemas basados en Macintosh usan \r como carácter de final de línea.
Si usa los caracteres de final de línea erróneos cuando escribe sus ficheros, se podrá encontrar con que otras aplicaciones que abran esos ficheros "parecerán raras".
Windows ofrece una bandera de traducción en modo texto ('t') que traducirá de manera transparente \n a \r\n cuando se trabaja con el fichero. En contraste, puede usar 'b' para forzar el modo binario, lo cual no traducirá su información. Para usar estas banderas, especifique 'b' o 't' como el último carácter del parámetro
mode
.El modo de traducción predeterminado depende de la SAPI y de la versión de PHP que esté usando, por lo que se le anima a especificar siempre la bandera apropiada por razones de portabilidad. Debería usar el modo 't' si está trabajando con ficheros de texto plano y usa \n para delimitar los finales de línea es su script, pero confíe que sus ficheros serán legibles por aplicaciones tales como notepad. Debería usar 'b' en los demás casos.
Si no especifica la bandera 'b' cuando está trabajando con ficheros binarios, puede experimentar problemas extraños con su información, incluidos ficheros imagen rotos o problemas extraños con los caracteres \r\n.
Nota:
Por portabilidad, se recomienda encarecidamente que siempre use la bandera 'b' cuando se abran ficheros con fopen().
Nota:
De nuevo, por portabilidad, también se recomienda encarecidamente que reescriba el código que usa o depende del modo 't' por lo que use los finales de línea correctos y el modo 'b' en su lugar.
use_include_path
El tercer parámetro opcional use_include_path
puede ser establecido a '1' o TRUE
si se desea buscar un fichero en
include_path también.
context
Nota: Soporte para context fue añadido en PHP 5.0.0. Para una descripción de contexts, refiérase a Flujos.
Devuelve un recurso de puntero a fichero si tiene éxito, o FALSE
si se produjo un error.
Si la apertura falla, se generea un error de nivel
E_WARNING
. Se puede usar @ para suprimir esta
advertencia.
Versión | Descripción |
---|---|
7.0.16, 7.1.2 | Se añadió la opción 'e'. |
5.2.6 | Se añadieron las opciones 'c' y 'c+' |
Ejemplo #1 Ejemplos de fopen()
<?php
$gestor = fopen("/home/rasmus/fichero.txt", "r");
$gestor = fopen("/home/rasmus/fichero.gif", "wb");
$gestor = fopen("http://www.example.com/", "r");
$gestor = fopen("ftp://user:password@example.com/fichero.txt", "w");
?>
Cuando se usa SSL, Microsoft IIS violará el protocolo, cerrando la conexión sin mandar un indicador close_notify. PHP avisará de esto con este mensaje "SSL: Fatal Protocol Error", cuando llegue al final de los datos. Una solución a este problema es bajar el nivel de aviso de errores del sistema para que no incluya advertencias. PHP pueden detectar servidores IIS con este problema cuando se abre un flujo usando https:// y suprime la advertencia. Si usáis la función fsockopen() para crear un socket ssl://, tendréis que suprimir la advertencia explicitamente.
Nota: Cuando el modo seguro está habilitado, PHP comprueba si el directorio en el cual el script está operando tiene el mismo UID (propietario) que el script que está siendo ejecutado.
Nota:
Si está experimentando problemas al leer y escribir ficheros y está usando la versión de módulo de servidor de PHP, asegúrese de que los ficheros y directorios que está usando sean accesibles por el proceso del servidor.
Nota:
Esta función también podría tener éxito cuando
filename
es un directorio. Si no se está seguro de quefilename
sea un fichero o un directorio, podría ser necesario utilzar la función is_dir() antes de llamar a fopen().