PHP: bajar ficheros con HTTP, leer y escribir a disco, y subir ficheros a FTP

Logo de PHPJeje, llevo unos cuantos días que no escribo en mi cuaderno de bitácora. No sé si alguien realmente me sigue aquí. Pero como vengo diciendo, no hay que perder las buenas costumbres 😉 En estos días de tanto ajetreo por la Navidad, más algunos proyectos y deberes pendientes de fin de año, que no he tenido casi tiempo..

En uno de los proyectos he tenido que andar bajando ficheros de feeds de datos, cruzando los datos y subiendo los resultados. Así que he pensado que un par de HOWTOs sobre esto a alguien le pueden venir bien. Y si has llegado aquí buscando como hacer cosas de estas, más sencillo no se me ha ocurrido cómo explicarlo.

Esto se aplica a ficheros de texto, si lo que tienes entre manos son ficheros binarios no todos los scripts son los que habría que usar.

Bajando ficheros, descargando

Decidí hacer esto en PHP, ya que el scripting con PHP es bastante sencillo. Con pocas líneas podemos tener unos ficheros descargados:

<?php
file_put_contents('nombreFichero1.ext', fopen('http://dominio.com/nombreFichero1.ext', 'r'));
file_put_contents('nombreFichero2.ext', fopen('http://dominio.com/nombreFichero2.ext', 'r'));
file_put_contents('aEsteLeCambioElNombre.ext', fopen('http://dominio.com/nombreFichero3.ext', 'r'));

En este caso con una sola línea ya hemos descargado un fichero. Esto lo ponemos en un fichero .php, por ejemplo, uno llamado descargar.php y lo ejecutamos así:

$ php descargar.php

Si esto lo programamos en los cronjobs de Linux cada X tiempo, ya tenemos entonces los ficheros actualizado cada X tiempo.

Leyendo el fichero de disco

Quizá necesitamos cargar en memoria, en un array o vector, como queramos llamarlo. Con esto pasará el fichero de disco a memoria principal, a la RAM. Así si tenemos que hacer operaciones sobre él. En el proyecto que lo necesité, simplemente con esto ya lo tenemos:

<?php
$vectorFichero = file('nombreFichero1.ext');
echo 'El número de líneas del fichero es de '.count('nombreFichero1.txt').PHP_EOL;
echo 'El contenido de la línea 123 del fichero es:'.PHP_EOL;
echo $vectorFichero[123];

Ya con esto tenemos todo el contenido del fichero en la variable $vectorFichero. En donde se ha cogido el fichero, separando en cada elemento del vector, cada línea del fichero. ¿Sencillo verdad?

Aquí es donde hacemos las operaciones que necesitemos. Quizá tenemos que cargar varios ficheros, unirlos en uno, mover los datos, filtrar líneas, lo que sea que necesitemos.

Ya que hemos leído el fichero de disco, lo grabamos a disco

Casi igual de sencillo:

<?php
file_put_contents('nombreFichero1.ext', $vectorFichero);

Ya con esto hemos grabado todas las líneas que están en el $vectorFichero al mismo archivo.

Subiendo ficheros por FTP, cargando

Para terminar, un sencillo ejemplo:

<?php
$ftpURL = 'ftp.detudominio.com';
$ftpUsername = 'usuario@detudominio.com';
$ftpPassword = 'lacontraseña';
$ftpDirectory = '/directorio/destino/donde/tienes/permiso/para/escribir/';

echo 'connecting.. ';
$connId = ftp_connect($ftpURL, 21, 30) or die("Could not connect to $ftpURL");
echo 'login.. ';
$loginResult = ftp_login($connId, $ftpUsername, $ftpPassword);
ftp_pasv($connId, true);
echo 'uploading.. ';
if (ftp_put($connId, $ftpDirectory.'nombreFichero1.ext', 'nombreFicheroDestino.ext', FTP_ASCII)) {
    echo "uploaded $filename.. ";
} else {
    echo "ERROR uploading $filename.. ";
}
ftp_close($connId);

Este código es un poco más elaborado, pero no deja de ser simple.

Terminando

Aunque PHP sea simple, te permite no declarar el tipo de las variables, sea un lenguaje de scripting.. todo eso que hablan mal los fans de otros lenguajes, compilados, más rápidos, o quizá más molones.. No podemos negar que PHP es práctico, soluciona los problemas, sin engorrosos rifi-rafes, es portable, y cada vez me gusta más sobre todo viendo todo lo que se está moviendo en el mundo de Composer y con el ya asentado PHP7 que le ha puesto el turbo a todo esto 😉

Compartir..

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *