Portada Blogs Álbumes Notas Herramientas Usuarios Ayuda
Blog de BLei couRT (cambiar): Página Principal Entradas Historial Estadísticas
Bienvenid@ a LoG85. Puedes registrarte o logearte.
Estás viendo la página 4 de BLei couRT, un blog de LaNsHoR. Escrita el 22/04/2009 a las 02:31:03.
Barras de progreso en el envío de archivos con PHP
Foto de la página 4 del blog de blei_court
Entrada 1 de 1
Ahora contaré como ocurrió, pero antes explicaré la razón de está página fuera de la planificación...

Resulta que me vi en la necesidad de conocer el progreso de envío de un archivo desde el lado del cliente mientras el envío tiene lugar (como hace, por ejemplo, youtube cuando subimos un vídeo mostrando una barrita de progreso). Por desgracia, la única forma (presunta) posible de hacer esto es usando cgis o módulos en otros lenguajes diferentes a php (como perl).

Como yo odio tener que mezclar unas cosas con otras, o usar bombas termonucleares para matar moscas, busqué si había alguna opción para hacerlo desde php sin guarrear mucho. Mi ilusión vino cuando encontré un método que podía usarse desde PHP 5.2 junto con la extensión APC (Alternative PHP Cache); la pega es que la documentación de esta extensión es escasa, y la poca que hay está en ingles, así que he dedico hacer esta miniguia con todo el proceso para quien pueda serle útil.

Pero antes... ¿a raíz de qué vino esta necesidad?.

Todo sucedió porque Axel tuvo el detalle de subir las fotos del cumpleaños de Carlos (250 megas) al almacen de archivos de log85 (con su cuenta log87) para evitarme, así, tiempos de espera en megaupload entre paquete y paquete (quería bajar otras cosas desde allí y no soy premium).

Al final los dos acabamos desesperados debido a la lentitud (¡no por el l85!, hubiera tardado lo mismo en megaupload; es cosa de las ridículas velocidades de transmisión salientes de las conexiones en España y mi bajada (que es su subida) es varios órdenes de magnitud superior).

Uno de los comentarios que me hizo Axel fue "esto no tira, se ha petao", a pesar de que todo iba bien y que un mensaje parpadeante decía "cargando... ¡espera!".

Entendí entonces que la gente si no ve "un progreso real" tiende a pensar que las cosas se han bloqueado, y que debería arreglar eso como sea. Decidí hacer una barra de progreso total, y contadores con la velocidad y los tiempos, tal que así:


De esta forma, nadie que vea avanzar el progreso y variar en tiempo real las velocidades, podrá tener la sensación de bloqueo.

Y ahora, veremos como se hace...

(***)

Como ya hemos dicho, PHP por si solo no proporciona ningún mecanismo para acceder a los archivos crudos mientras se suben. Para esto vamos a tener que instalar una extensión de PHP que, en cualquier caso, es lo "menos" ajeno que podemos hacer.

La extensión es APC, sirve para cachear la compilación al vuelo de los fuentes de php aumentando el rendimiento considerablemente. Además nos proporciona un mecanismo descrito en el rfc1867 para acceder a los archivos crudos mientras se suben al servidor.

APC normalmente se instala con el paquete "apc", pero en mi gentoo el paquete es "pecl-apc", en cualquier caso una búsqueda de "apc" en vuestro gestor de paquetes debería daros el nombre correcto:

emerge pecl-apc

Una vez instalado es hora de configurarlo. En mi gentoo se crea automáticamente el archivo /etc/php/apache2-php5/ext-active/apc.ini, el cual se procesa justo después de php.ini. Si no tenéis un archivo de configuración concreto para apc, debéis añadir la configuración a php.ini. A continuación pongo mi configuración y comento las líneas importantes:

Configuración:
extension=apc.so //Define el nombre de la librería dinámica
apc.enabled="1"
//Activa el uso de APC, si es 0 APC no funcionará
apc.shm_segments="1"
apc.shm_size="30"
apc.num_files_hint="1024"
apc.ttl="7200"
apc.user_ttl="7200"
apc.gc_ttl="3600"
apc.cache_by_default="1"
;apc.filters=""
;apc.mmap_file_mask="/tmp/apcphp5.XXXXXX"
apc.slam_defense="0"
apc.file_update_protection="2"
apc.enable_cli="0"
apc.max_file_size="1M"
apc.stat="1"
apc.write_lock="1"
apc.report_autofilter="0"
apc.include_once_override="0"
apc.rfc1867="1"
//Esta línea debemos activarla para tener acceso a los archivos mientras se suben (off por defecto)
apc.rfc1867_prefix="upload_"
//Prefijo a usar con los ids de los archivos
apc.rfc1867_name="APC_UPLOAD_PROGRESS"
apc.rfc1867_freq="0"
apc.localcache="0"
apc.localcache.size="512"
apc.coredump_unmap="0"


Una vez todo configurado, reiniciamos el servidor e iniciamos las pruebas.

Para que todo funciona, debemos poner justo antes del input file que queramos monitorizar la siguiente línea html:

<input type="hidden" name="APC_UPLOAD_PROGRESS" value="id_archivo">


id_archivo debe ser único en todo el server en todo el tiempo, por ello quizás deberíamos crearnos un manejador que nos abstraiga de todo el proceso y genere ids únicas. En cualquier caso, con esto ya podremos acceder desde php al archivo usando su id.

Con ajax podremos llamar a otra página a la que le pasaremos el id del archivo, esa página en php devolverá los datos sobre el archivo que queramos:

Importante: Desde la página hay que añadir el prefijo "upload_" al id del archivo.

$upload=apc_fetch("upload_$clave");
if($upload)
  {
  if($upload['done'])
      $percent=100;
  else if($upload['total']==0)
      $percent=0;
  else
      $percent=$upload['current']/$upload['total']*100;
  }
echo $percent;


El campo current muestra cuantos bytes han sido subidos desde el archivo, y el campo total muestra el tamaño total del archivo; el campo done es un booleano que muestra si el archivo ha terminado de subirse.

Con estos datos ya podemos calcular el porcentaje, y si usamos, desde el cliente, temporizadores y un registro de los datos (por ejemplo, comprobamos cuánto del archivo se ha subido cada 2 segundos), podremos calcular cosas como el tiempo restante estimado, la velocidad actual, la velocidad media, etc.

(***)

En una tarde tuve el sistema funcionando y, en la próxima actualización del motor del log85, todos los almacenes tendrán esta función.

Espero que le sea útil a alguien :)
Archivado en: PHP.
8 PostsPrimogénito: Axel
** ** ** *- -- Cargando...
Post 1 de 8 // 23/04/2009 a las 21:09:58 Divertido x 12.18c.
Axel
Neófito
Avatar de axel
**----
15.00 culombios
2870 p.d.exp.
Un eón
Caballero
cLicK
Joder, no sé si sentirme mal. Pero mejor me sentiré glorioso por ser el motor del cambio en Log87, que diga... 85. Todos debéis darme las gracias, porque es por mi voluntad, y únicamente mi voluntad, que podeis disfrutar de cuentas virtuales y barritas de subida (¡yipeeee!).

Ahora en serio, deja de implementar cosas porque yo sea un impaciente o un retorcido, que comienza a lastrar mi conciencia ;) .

¿Por qué no rompes una lanza por las causas -todavía- más perdidas, como poner juegos java en Log8x (la gran cruzada de Big Kahuna)?.

De mientras, te lo agradeceré subiendo cosas para ver la barrita avanzar. Si por la mañana tienes el PC-servidor hasta los bordes de basura, esto... habrá sido Neton.   
Si todos los gilipollas se quemaran a lo bonzo, ya tendríamos coches de hidrógeno.
Post 2 de 8 // 24/04/2009 a las 00:31:08 15c.
BLei couRT
Diestra Y Entendida
Avatar de blei_court
***---
7.00 culombios
10412 p.d.exp.
Un eón
Doncella
Sí pero recuerda que las barritas no están terminadas! Las pondré más adelante junto con otros cambios.

No te preocupes por lo de hacer cosas... it's just for fun!! guinyo
C te facilita dispararte en el pie. C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna entera.
Post 3 de 8 // 24/04/2009 a las 01:21:02 Interesante x 25.69c.
granaína
Dama De Las Tinieblas
Avatar de granaina
****--
16.00 culombios
71328 p.d.exp.
Un eón
Doncella
no acabo de pillar xa q quiere alguien juegos java en el log... le preguntaré al interesado en otra ocasión...

necesitas sugerencias xa próximas actualizaciones? q sabes sobre "seguridad internetera"? aunq en este caso lo pregunto a nivel usuario... he cometido el error de pedir la firma digital en otro ordenador :s pasa algo si me la envian x email?
si no sabes sobre esto no pasa nada, tú sigue estudiando!!!! q seguro q te es más útil!
la poesía no es de quien la escribe, sino de quien la necesita...
Post 4 de 8 // 24/04/2009 a las 01:46:48 ACK! x 16.39c.
BLei couRT
Diestra Y Entendida
Avatar de blei_court
***---
7.00 culombios
10412 p.d.exp.
Un eón
Doncella
Todavía quiero escribir la actualización larga sobre introducción a los gráficos 3D, pero como quería hacer un pequeño programita a modo de ejemplo junto con la act... es posible que la cosa se demore.

El tema que propones es muy interesante, pero es bastante amplio y puede abarcar muchas cosas; podría intentar hacer un pequeño resumen de hasta que punto es seguro que nadie lea lo que mandas a la web (textos, nombres de usuario, contraseña, conversaciones en chats, etc) o lo que se aloja en un servidor (lo que tienes en tu email) y cómo funciona esa seguridad y en qué se basa.

Así que probablemente... la siguiente actualización la haga de eso :D

¡Gracias por la sujerencia!
C te facilita dispararte en el pie. C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna entera.
Post 5 de 8 // 24/04/2009 a las 11:02:43 Divertido x 24.58c.
Big Kahuna
Vórtice Paladínico
Avatar de big_kahuna
****--
8.00 culombios
86444 p.d.exp.
Un eón
Caballero
cLicK
Granaína, yo tampoco termino de pillar lo de los juegos en el log...directamente no entiendo pq Axel me menciona xD. Supongo q como siempre, será una idea que tiene en mente y se la adjudica a otro, o tal vez se referirá a otro Big Kahuna babosa
                                                                   
-Que empiece el juego, nena.
Post 6 de 8 // 24/04/2009 a las 13:43:19 Buen Intento x 13.9c.
Axel
Neófito
Avatar de axel
**----
15.00 culombios
2870 p.d.exp.
Un eón
Caballero
cLicK
Viniendo de alguien que dijo de integrar "el pro" en Log8x, me parece un poco extraña tu contestación. Quizás mi propuesta es coña, como era la tuya. Cuando se trata de mí no hay nada que entender lluvia <-El menda el 18.

Aún no oigo las gracias por las cuentas virtuales y las barritas de subida dirigidas a mi persona... ¿A que hago a Lanshor poner un botón de vetar?

¡Duelo de vetos!¡Bailad marionetas! *Tsk. Mira que hay smileys, pero no hay ninguno de un titiritero. ¡Exijo uno, Lanshor!*
Si todos los gilipollas se quemaran a lo bonzo, ya tendríamos coches de hidrógeno.
Post 7 de 8 // 24/04/2009 a las 14:21:06 25.69c.
granaína
Dama De Las Tinieblas
Avatar de granaina
****--
16.00 culombios
71328 p.d.exp.
Un eón
Doncella
axel no distraigas a lanshor q todavía no me ha buscado el del muñequito revolcándose de risa... y YO no pudo darte las gracias, xq los NO bloggers NO podemos acceder al almacén, la verdad q no entiendo xq...

de todas maneras entiendo tu felicidad para con el log ya q yo x una tb me siento útil de haber inspirado algo aquí xD

la poesía no es de quien la escribe, sino de quien la necesita...
Post 8 de 8 // 24/04/2009 a las 15:49:10 ACK! x 16.76c.
BLei couRT
Diestra Y Entendida
Avatar de blei_court
***---
7.00 culombios
10412 p.d.exp.
Un eón
Doncella
Sigo buscando de vez en cuando... pero no encuentro el dichoso smiley de la risa, a partir de ahora incorporaré el titiritero en mis búsquedas.

Además anuncio, que ayer empecé a escribir la página sobre seguridad. A ver si puedo hacerla completa, amena, y comprensible y en un par de días la publico.

Respecto al almacén... ¿para qué quiere un no-bloger el almacén?, no quiero ser clasista... pero creo que el uso que puede darle es limitado y fuera del ámbito para el cual fue disiñado.

En cualquier caso la solución es simple: Be blogger, my friend.
C te facilita dispararte en el pie. C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna entera.

Anónimo

Páginas
Vista Previa de la página 10 del blog de blei_courtPágina 10
Vista Previa de la página 9 del blog de blei_courtPágina 9
Vista Previa de la página 8 del blog de blei_courtPágina 8
Vista Previa de la página 7 del blog de blei_courtPágina 7
Vista Previa de la página 6 del blog de blei_courtPágina 6
Puntuación
WARNING!!!
Sorry for my poor English

llorandollorandollorandollorandollorando
Estadísticas
5694 Días
1778 Visitas
8 Posts
Postea una de
cada 222 visitas
Licencia

"Si nos espera el olvido, tratemos de no merecerlo." Alejandro Dolina