Thursday 21 May 2009

FireFox, solución a "Ha escogido abrir..."

Este artículo es un poco técnico, pero me veo obligado a publicarlo para compartir la solución a un problema que creo que es más común de lo que parece y sobre el que he encontrado muy poco escrito. Pienso que los desarrolladores de aplicaciones web que lo lean me lo agradecerán. Tal vez no te haya ocurrido nunca, pero ya llegará el día, jejejeje...

Signos del problema

- Cuando se intenta acceder a ciertas páginas de la aplicación, el navegador tarda en responder como casi un minuto y luego -al menos en FireFox- aparece una ventana en la que el mensaje dice "Ha escogido abrir este archivo..." y te da la opción de guardar el "supuesto" archivo PHP en lugar de mostrar el contenido de la web. Si pruebas a visitar la misma página desde IE la página quedará completamente en blanco y no mostrará nada.

- Es posible que algunas páginas de la web si vayan, porque sean HTML, pero también algunas de PHP también pueden verse mientras otras no. Después de leer el artículo entero entenderás porqué.

- El problema te ocurre tanto si visitas las web desde tu PC o desde cualquier otro. Aunque ten cuidado con las copias guardadas en caché!!! te pueden jugar "bromas pesadas": hacerte creer que una página se ve bien cuando realmente no es así, o al revés! Para estar seguro siempre de que el navegador te muestra la página devuelta por el servidor te aconsejo refrescar la página con CTRL+F5.

Causa del problema

- Tu aplicación web está teniendo algún "problema" en algún punto de sus "cálculos": en algún lugar del código se entra en una especie de "bucle infinito" que deja a la aplicación "pensando indefinidamente". Por esta causa el servidor da una respuesta "incoherente" al navegador, o digamos que el navegador no sabe interpretar la respuesta (¿curioso, verdad?).

- Por ejemplo, en mi caso se trataba de una clase que yo había programado para acceder a un archivo histórico, que cuando accede bloquea/desbloquea un archivo como señal de alerta para otros "hilos" de la aplicación, de que no pueden acceder en ese momento a la aplicación. La cuestión es que este sistema me funciona sin problemas (hasta ahora). Pero la empresa de hosting hizo una especie de restauración de backup en los servidores que debieron alterar los permisos de escritura sobre el directorio en el que está ubicado el archivo. En conclusión: mi aplicación se quedaba encallada en ese punto: intentando acceder a ese archivo permanentemente "bloqueado". Una vez que descubrí este fenómeno, la solución fue fácil: por FTP cambié los atributos del directorio para poderse escribir en él!

- Sin embargo, mi caso es muy particular y entiendo que difícil de repetir por otros programadores. Pero no así el problema de fondo: dejar a la aplicación en "stand by" (o en bucle) hasta resolver algo irresoluble. Por ejemplo, entre los comentarios que he leído en otros foros, hay gente que le ha pasado exactamente lo mismo cuando su aplicación web intenta hacer un "fopen", que es una lectura de un archivo remoto con PHP. Lo que quiero decir es que si no te ha pasado todavía (como desarrollador web) es muy posible que te pueda pasar en breve. Sobretodo hoy en día en el que la programación con webservices y consultas remotas está tan a la orden del día ;)

- [Nota añadida 8-ago-2009] Hoy me ha ocurrido otra vez un bucle de esos que me ocasionó el mismo error! Aunque esta vez, sabiendo que se trataba de un bucle infinito he ido haciendo "debugeo" hasta encontrar donde se me "colapsaba" la aplicación ;) El bucle era del tipo "función recursiva MAL HECHA":

function mi_funcion(){
if (condicion)
return mi_funcion();
else
return 'a otra cosa mariposa';
}


Con lo cuál, en los casos en que "condición" es verdadero se llama de nuevo a la misma función, en un bucle infinito!! ¿Cuál fue esta vez mi error...? pues que en realidad cuando escribí el código quería llamar a una "mi_segunda_funcion()" en el caso de que "condicion" fuera verdadero... en fin, que me equivoqué con el nombre de la función!!! :((( es uno de esos errores del "copiar y pegar", del que no hace falta que diga mucho más, verdad?! jejeje...

Bueno, en fin, cualquier comentario al respecto será bienvenido, si te ha pasado lo mismo o algo parecido. No dudes en comentarlo aquí... igual que tú has llegado hasta aquí con ese problema, detrás tuyo vendrá más gente a quien le podrá ser útil! no olvides escribir tu solución cuando la halles! ;)

Un saludo!
SERGI
PD: está lloviendo!!! jajajaja... se agradece en este tórrido territorio (desierto de Sonora, México) en donde solo ayer estabamos a 43 grados (a finales de Mayo...).

7 comments:

  1. No tengo un problema de permisos (revisado varias veces) y sin embargo me sigue haciendo problemas. Que otra cosa puede ser?

    ReplyDelete
  2. Hola Tepi, en la nota añadida en mi artículo con fecha 8-ago-2009, expongo otro ejemplo de "bucle infinito": una función que se llama a sí misma infinitas veces. Eso también provocará probablemente el problema expuesto!

    Pero de hecho, es un ejemplo, más. En realidad puede haber inifinitas razones por las que tu aplicación ha entrado en un bucle infinito (bucle=repetir una misma secuencia de pasos, repetidas veces seguidas).

    Te aconsejo un truco sencillo pero lento: ves escribiendo los comandos

    echo 1111; die();

    en tu aplicación, desde el inicio hasta el final. Empieza poniéndolo entre las primeras líneas del primer archivo que responde a la llamada del navegador (index.php supongo) y verás que si llamas a la aplicación te aparecerá en el navegador 1111 y ya. Luego cortas esa línea de código y la pegas un poco más abajo y vuelves a probar en el navegador. No hace falta que lo hagas de línea en línea!!! solamente antes y después de los puntos "difíciles" de tu aplicación: acceso a archivos, acceso a funciones complejas, etc... Y en algún momento sucederá que ya no se te muestra el 1111 y acontece el error que estás intentando resolver. Y bueno, entonces ya sabrás dónde está el origen de tu problema ;)

    Tal vez es un método excesivamente sencillo de debugeo.. pero funciona. Por cierto, hay otra "estrategia" para ir más rápido con el debugeo del 1111: en lugar de comenzar por el principio de la aplicación, situa el comando del 1111 en la MITAD de la aplicación. Si entonces no te da error desde el navegador sabes que el error está en la "segunda mitad" de tu código, y entonces pones el 1111 en la mitad de esa segunda mitad. Y así vas repitiendo el proceso, "por mitades", según aparezca o no aparezca el 1111 en el navegador ;) De hecho creo que es un método bastante efectivo.

    Espero que te haya ayudado ;)
    Un saludo!
    SERGI

    ReplyDelete
  3. vaya mierda de solucion(donde esta?)

    ReplyDelete
  4. @Anónimo: me parece que está puesto bien clarito (hacia la mitad del artículo):

    Causa del problema

    - Tu aplicación web está teniendo algún "problema" en algún punto de sus "cálculos": en algún lugar del código se entra en una especie de "bucle infinito" que deja a la aplicación "pensando indefinidamente".

    Es cosa tuya averiguar DÓNDE tu aplicación entra en un "bucle infinito". Cada caso será obviamente diferente. Solo te queda debugear! ;)

    Por cierto, cuando comentes en un blog o foro, no es necesario que te registres, pero no cuesta nada dejar tu nombre, al menos para saludar :)))

    ReplyDelete
  5. Que carajos le pasa a mi firefox

    ReplyDelete
  6. Hola buen dia espero me puedan ayudar. Cada vez que ingreso una palabra o frase en google; me sale el siguiente cartel como si fuera a descargar un archivo por medio del navegador:
    Ha escogido abrir search;
    que es de tipo: application/json
    Me podrian decir que debo hacer para solucionar este inconveniente. un saludo desde colombia. mi correo es: soycapitancentella@hotmail.com

    ReplyDelete
  7. Bueno, a mi me esta apareciendo una ventana que en su solapa dice: "Abriendo anti-Keylogger-10-3-3-es-en-br-fr-de-it-win.exe"
    luego dice: "Ha escogido abrir
    anti-Keylogger-10-3-3-es-en-br-fr-de-it-win.exe
    que es de tipo: Application (1,2 MB)
    de: http//downloads3.uptodown.com
    ¿Le gustaria guardar este archivo?"
    Guardar archivo Cancelar


    que es? alguien me esta queriendo hackear?

    ReplyDelete