LLAMANOS: 994548099 / RPM #994548099 / RPC 976205506

Como subir archivos grandes con PHP

Subir un archivo usando PHP es una tarea f'ácil. El manual oficial de PHP tiene una sección dedicada al manejo de uploads de archivos y hay una gran cantidad de artículos en la web para aprender a hacerlo.

Uno de los usos más populares es para subir imagenes. Los usuarios pueden de esta manera subir imágenes usando un formulario sin necesidad de recurrir a otros protocolos como el FTP.  HTML5 y Flash permiten hacerlo usando drag and drop, de manera que la operación se vuelve más fácil.

Aqui es donde empiezan los problemas. Los fabricantes de cámaras aumentan día a día la cantidad de Megapixeles de sus unidades para vencer a sus competidores. Pero, a menos que seas un profesional de la fotografía o necesites imprimir imágenes grandes, todo por encima de los 4Megapixeles y casi innecesario. Aún las cámaras más económicas superan hoy en día los 10 Megapixeles e incluso los celulares tienen más de 5 Megapixeles. El resultado de esta calidad de dispositivos son fotos que pesan mas de 6 MB.

Por defecto, PHP permite subir archivos que pesen un máximo de 2MB. Uno puede pedirle a los usuarios que redimensionen sus imágenes antes de subirlas pero enfrentémoslo, lo más probable es que no lo hagan. Afortunadamente podemos incrementar ese límite si es necesario.

Hay dor opciones en PHP que controlan el límite para la subida de archivos: upload_max_filesize y post_max_size.
Ambos pueden definirse a un valor mayor, por ejemplo 10M para 10 Megabytes.

Sin embargo, también se deberá considerar el tiempo que tomará subir un archivo grande. Los scripts PHP normalmente alcanzan el tiempo límite de ejecución que es de 30 segundos, pero un archivo de 10MB tomaría al menos 3 minutos pa el Perú). Por lo tanto vamos a necesitar definir el tiempo de ejecución máximo a un tiempo mayor a 30 segundos, como por ejemplo 5 minutos.

Estas opciones pueden definirse el el archivo de configuración php.ini de manera que se usen en toda la aplicación. Como alternativa, si usan Apache, pueden configurar estos valores usando un archivo .htaccess como el que se muestra a continuación :

php_value upload_max_filesize 10M
php_value post_max_size 10M
php_value max_execution_time 300

Finalmente, podemos definir estas constantes dentro de nuestra aplicación:
ini_set('upload_max_filesize', '10M');
ini_set('post_max_size', '10M');
ini_set('max_execution_time', 300);

PHP también nos provee de la función set_time_limit() para no necesitar usar max_execution_time directamente.

Definir estas opciones dentro del código PHP is posiblemente la mejor opción ya que podemos usarla sólamente cuando sea necesario.