Archivos grandes con PHPseclib

Uno de los mejores conjuntos de plugins, o clases, o librerías externas, para PHP es PHPseclib (PHP secure library) la cual implementa de manera mucho más intuitiva las funcionalidades para acceder a servidores con SSH y SFTP. Lo malo de casi todas estas librerías es que no son distribuciones oficiales y por tanto estamos sujetos a los intereses o convicciones de cada programador.

phpseclibLas ventajas de PHPseclib son muchísimo mayores que sus desventajas, que las hay, una de ellas por ejemplo es su incapacidad de gestionar correctamente el tamaño de archivos superiores a 4 GB. Según reza en la misma documentación de la clase:

Los archivos de más de 4GB se mostrarán como si tuviesen exactamente 4GB.

Los tamaños de archivos están representado por un número entero de 64 bits, no se debe utilizar Net_SFTP para transferir archivos con más de 4 GB (0xFFFFFFFF bytes) porque todos los tamaños de los archivos que son más grandes se representarán como 4GB.

La solución para esto es reescribir la función size de la clase SFTP.php.

Lo primero que haremos será comentar la siguiente línea return $this->_size($filename);

Luego escribiremos las siguientes líneas (el resto de validaciones anteriores las dejamos)

Lo primero es utilizar la función stat de linux con los parámetros –c y %s para que nos devuelva el resultado en bytes
$command = "stat -c %s \"{$filename}\"";

Ejecutamos este comando y guardamos la salida
$filesize = $this->exec($command);

Esta salida puede tener saltos de línea así que la limpiamos
$filesize = trim(strtr($filesize, array("\r\n" => '', "\r" => '', "\n" => '')));

Devolvemos el tamaño del archivo o false si no es correcto
return (!is_numeric($filesize))?false:$filesize;

De esta forma tendremos el tamaño real de todos los archivos del sistema utilizando esta librería.

Comentarios