Leer ficheros con PHP

  • Por
  • 22 de enero de 2010
  • Valoración:
  • 6 Comentarios
  • PHP
Cómo leer un fichero con PHP completo, es decir, abrir el archivo de texto y leer todo su contenido o abrir una URL y recibir todo su contenido.
En este sencillo taller de PHP vamos a mostrar cómo se puede leer un archivo de principio a fin con PHP. Cuando nos referimos a un archivo, de manera general nos referirnos a streams (flujos) de texto, que se puedan acceder a través de las funciones PHP para manejo de archivos, como el contenido de texto de un fichero de texto que haya en el sistema de archivos del servidor o el flujo de texto que podemos obtener al acceder a una URL con PHP, de cualquier servidor web.

Cabe recordar antes de empezar que en DesarrolloWeb.com se han publicado en el pasado diversos artículos sobre este tema, que contienen interesantes informaciones para poder seguir este taller de PHP. Si deseas obtener una base, debes leer pues el manual sobre trabajo con archivos en PHP.

Generalmente, cuando queremos leer el contenido de un flujo de texto, queremos obtener todo el contenido del fichero o la URL, por lo que puede ser útil mostrar un par de sencillos scripts que pueden darnos la facilidad de obtener el contenido completo del archivo, sin preocuparnos por su longitud. Esto lo vamos a ver ahora de manera que quede al alcance de cualquier desarrollador sin demasiada experiencia en el lenguaje de programación PHP.

Leer el contenido de un fichero de texto completo con PHP

Empecemos viendo el caso de un archivo de texto, que tiene algunas diferencias y mayor facilidad en comparación con la lectura del contenido de una URL. A ser sinceros, la lectura de estos archivos de texto por medio de PHP se realiza utilizando tan solo funciones existentes en PHP, por lo que nuestra aportación es más bien poca.

Existe una función fopen() que sirve para abrir el archivo de texto, desde su localización en el sistema de ficheros del servidor. Luego utilizamos fread() para leer el contenido del fichero. Pero el detalle más crucial es que fread() necesita la longitud en bytes a leer y, como nosotros en principio no conocemos cuál es la longitud del fichero, utilizamos la función de PHP filesize() que nos devuelve este dato.

Veamos pues la función PHP que podremos utilizar para leer el contenido de un fichero cuyo nombre se recibe por parámetro.

function leer_fichero_completo($nombre_fichero){
   //abrimos el archivo de texto y obtenemos el identificador
   $fichero_texto = fopen ($nombre_fichero, "r");
   //obtenemos de una sola vez todo el contenido del fichero
   //OJO! Debido a filesize(), sólo funcionará con archivos de texto
   $contenido_fichero = fread($fichero_texto, filesize($nombre_fichero));
   return $contenido_fichero;
}

Leer el contenido de una URL con PHP

De manera similar a como podemos leer un fichero con PHP, podemos leer el contenido de una URL de cualquier página web, en cualquier servidor de Internet. Es decir, en vez de utilizar un flujo de texto que viene de un archivo de texto del servidor, utilizamos el flujo de texto que nos devuelve un servidor web al solicitar una página, es decir, obtener el código HTML completo que el servidor devuelve cuando se le solicita una URL.

Nuevamente debemos admitir que este script no tiene realmente mucha dificultad ni resulta muy especial. Hasta quizás muchos de vosotros lo habréis utilizado, este u otro similar. El detalle es que, por lo menos que yo sepa, no podemos obtener el tamaño del fichero, en bytes, de una URL enviada por un servidor web, por lo que no podremos utilizar la función filesize() que tanto nos facilitaba las cosas anteriormente. Pero la solución pasa por leer cualquier bloque de datos y continuar leyendo en un bucle hasta que el flujo de texto se termine.

function leer_contenido_completo($url){
   //abrimos el fichero, puede ser de texto o una URL
   $fichero_url = fopen ($url, "r");
   $texto = "";
   //bucle para ir recibiendo todo el contenido del fichero en bloques de 1024 bytes
   while ($trozo = fgets($fichero_url, 1024)){
      $texto .= $trozo;
   }
   return $texto;
}

Como se puede ver, se recibe un parámetro con la URL que se desea leer, aunque la función también valdría para leer archivos de texto del servidor en caso que especifiquemos el nombre de un fichero. Luego hacemos un blucle while en el que vamos leyendo bloques de 1024 bytes y los vamos metiendo en una variable hasta que no quede contenido en el flujo de texto por leer.

Conclusión

Hemos visto un par de funciones en PHP bien sencillas para leer ficheros de texto y otros flujos de texto, como por ejemplo código HTML que nos devuelve un servidor al solicitar una URL. No resultan para nada complejas y quizás hasta puede que no resulten muy novedosas para los lectores, pero esperamos sirvan para complementar las informaciones del manual sobre trabajo con archivos en PHP.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Comentarios

Antonio

22/1/2010
file_get_contents
La función file_get_contents() tiene ese cometido y es más simple de usar en muchos contextos.

Ricardo Rivas

22/1/2010
Cual es la varible de la ruta del archivo??
function leer_fichero_completo($nombre_fichero){
//abrimos el archivo de texto y obtenemos el identificador
$fichero_texto = "/home/ricardo/Desktop/pruebas.txt";
$fichero_texto = fopen ($nombre_fichero, "r");
//obtenemos de una sola vez todo el contenido del fichero
//OJO! Debido a filesize(), sólo funcionará con archivos de texto
$contenido_fichero = fread($fichero_texto, filesize($nombre_fichero));
return $contenido_fichero;
}

emilio_matei

02/2/2010
Simular un browser
En algunos sitios no se puede"llamar" una página usando php del modo en que se dice aquí porque "contesta" que no está permitido. Imagino que eso se debe deber a alguna razón de seguridad. ¿Alguien sabe cómo puede uno "disfrazarse" de IE o Firefox para que dicho sitio envíe la respuesta? Esto es muy importante para mí porque necesito averiguar automáticamente si un link todavía sigue en posición.
¡Gracias por la ayuda!

Gabriel

13/12/2011
enviar datos con file_get_contents
Hola maestros. Tengo un problema y es el siguiente:

Yo estoy ocultado una url de descarga y envío los datos con la función file_get_contents. Sin embargo esta función tiene un problema y es que cuando un archivo es mayor de 64 KB aproximadamente no permite descargarlo y envía el contenido del archivo de 1 KB que al abrirlo en bloc de notas logicamente aparece el error de insuficiente memoria.

Intenté aumentar la memoria con ini_set y solo llega a descargar aproximadamente hasta 64 KB.

Investigué que la función file_get_contents en la versión 5 de php incluye otros parámetros y en mi caso, bajo mi servidor afortunadamente poseo esta versión.

El código es el siguiente:


$ini = 0;
$total = filesize($ruta_archivo);
$lon = $total / 10;

while($ini < $total){
echo file_get_contents($ruta_archivo,NULL,NULL,$ini,$lon);
$ini += ($lon + 1);
}

Lo que intento hacer es dividir el tamaño del archivo en 10 trozos y enviar cada trozo hasta completar el archivo, pero siempre se presenta el mismo problema de los 64 KB aunque se aumente la memoria con ini_set o se especifique una hora o mas de duracion de script con set_time_limit.

Alguna sugerencia?

Gracias por sus amables respuestas

Ramon

19/7/2012
Lectura de fichero
como es que puedo leer solo partes del fichero es ddecir puedo leer por eejemplo las primeras 3 y las ultimas 3 lineas de mitextosin leer las las otras

Pereyrangel

19/7/2012
lectura diferida
como es que puedo leer solo partes del fichero es ddecir puedo leer por eejemplo las primeras 3 y las ultimas 3 lineas de mitextosin leer las las otras

Compartir