viernes, 23 de marzo de 2012

Resolviendo problemas

Este es un post muy específico para explicar una cuestión con el que nos hemos topado y cómo ha sido resuelta. Estamos en el contexto de realizar la verificación, ya que aún no hemos entrado en la fase de entrenamiento. El post está escrito por Guillermo, mientras que Álvaro avanza con el jQuery webcam plugin (que también esta presentando sus propias complicaciones...).

El plugin de captura de audio, WAMI, funciona de modo que al hacer una grabación, la pasa a un script PHP. Este script se encarga de guardar el audio en disco bajo formato .wav. No es el caso, pero si se quisiera tratar el audio para codificar en otro formato, aquí sería el lugar para hacerlo.


La ejecución del script empieza al pulsar el botón de Stop. Esto implica que un usuario que grabe su voz va a generar un fichero .wav guardado en disco antes de haberse autenticado. Hay que tener en cuenta el siguiente par de situaciones:

  1. El usuario graba su voz y hace login. El audio deberá ser borrado o trasladado, ya que la verificaciónha terminado y no volverá a ser necesario.
  2. El usuario graba su voz pero abandona la web sin hacer login. En este caso, se ha generado un archivo de audio, pero es imposible borrarlo en el momento.
La primera situación es algo a tener en cuenta, pero la segunda si es un problema. No tratarlo supondrá que tarde o temprano se sobrepasará la capacidad de almacenamiento.

La primera idea para resolverlo fue llevar un registro de los archivos de audio grabados en la base de datos. La idea de crear una nueva tabla y guardar los nombres de los ficheros que se iban generando no era mala. Para borrar los archivos "abandonados", simplemente habría que añadir en reservas.php una sentencia SQL de borrado. Así, cada vez que se cargara la página de reservas, se comprobaría la hora (timestamp) de los archivos guardados y si difiere de la hora actual en un número determinado de minutos, el archivo de borraría de la tabla y del disco.

Sin embargo, esta opción simplemente no funcionaba. La inserción en la tabla la llevaría a cabo audio.php y por motivos desconocidos no funcionaba. Aparentemente era un thread diferente porque no podíamos mostrar nada por pantalla con echo. Escribiendo este post me doy cuenta de que podríamos haber puesto trazas y haberlas registrado en un archivo log, pero en aquel momento no lo pensamos.

La segunda opción fue recurrir a la consola de comandos mediante la instrucción system, pero eso no llevó a ningún lado. Sin embargo, investigando esta solución encontré una herramienta para la consola de Windows: File Remover. Es un pequeño programa gratuito para seleccionar y borrar los archivos en un directorio con una edad superior a la indicada. El programa admite una precisión de hasta minutos, que es precisamente lo que necesitábamos. Los detalles de cómo funciona están aquí (el resultado de ejecutar fr.exe).


En principio funciona perfectamente incluso con rutas relativas, para así evitar poner http://localhost... que da errores. El problema es que al ejecutar el comando con system() no hace nada. Esta solución tuvo que ser descartada por eso. Si resulta que estamos usando system() mal, lo averiguaremos al intentar usar los programas de identificación. Además, esta solución planteaba el nuevo problema de que si el servidor funcionaba sobre Linux, que era lo más probable, habría que buscar de nuevo otra opción.

La solución válida y final ha sido usar un código de dominio público que sirve justamente para lo que queremos. Insertando este fragmento en el lugar adecuado, ahora los archivos de audio con una edad superior a un tiempo determinado por nosotros se borran automáticamente. El problema está resuelto.

En resumen, los pasos fueron:

  1. Intentarlo por uno mismo creando una base de datos y registrando los nombres... fracaso
  2. Seguir intentándolo por uno mismo. buscar un poco y encontrar un programa... fracaso
  3. Buscar el problema en Google directamente y ver cómo lo han hecho los demás... acierto!
Esta es una de las ventajas de PHP, que está tan extendido que encontrar solución a tus problemas es bastante fácil (si buscas bien).