Otra de “bugs”: PHP “Warning: Cannot modify header information”

0 comments

Posted on 3rd September 2010 by Luis M. in Español |Informática

Esta semana me he topado con otro “bug” realmente extraño, esta vez en PHP. Estábamos desarrollando el proyecto en nuestro sitio de desarrollo y el código en cuestión funcionaba bien. Se trataba de una sencilla llamada a un fichero PHP que realizaba una redirección en función del resultado de una consulta.

El cliente decidió cambiar de alojamiento web, así que cogimos todos los “bártulos” (ficheros, base de datos y demás) y nos pasamos al nuevo servidor. Nos encontramos varios problemillas, por ejemplo, que el primer servidor era Windows y el segundo Linux, o que la versión de PHP no era exactamente la misma. Tras varios ajustes de configuración, el sitio salió andando… salvo la sección donde se hacía la redirección. El error que daba era:

Warning: Cannot modify header information – headers already sent by (output started at /todo/el/camino/a/un/include/archivo.php:1) in /todo/el/camino/a/mi/archivo.php on line 37

La línea que daba el error (la 37) era donde estaba la llamada a la función header, responsable de la redirección. Como se explica en la documentación, la llamada a la función debe hacerse antes de enviar hacia el navegador cualquier cosa. El error que estaba apareciendo me notificaba que ya existía una cabecera que había empezado en otro archivo, para más señas en la línea 1.

El fichero donde supuestamente se había enviado algo al navegador era un fichero insertado en el código con una instrucción include. La línea 1 era el clásico <?php donde, claramente, no se envía nada hacia el navegador. En todos los foros donde miré hablaban de espacios, tabuladores u otros caracteres antes de la etiqueta de comienzo de PHP, pero yo no tenía nada (o eso creía yo en aquellos momentos). Además, ¡el mismo código funcionaba en mi servidor de desarrollo Y en el primer servidor de producción!.

Solventamos el problema temporalmente eliminando el include y copiando las funciones necesarias directamente en el mismo fichero. La redirección se hacía correctamente, pero ahora el problema surgía con una llamada a session_start(). La sesión daba problemas porque la cabecera ya había comenzado (otra vez en la línea 1, esta vez del mismo fichero) y la llamada a la sesión debe hacerse en la primera línea de código. Desgraciadamente para mí, no me dio por releer la documentación de session_start() (ya sabía que la llamada se debía hacer en la primera línea, y así lo estaba haciendo), porque la solución estaba en una de las notas de los colaboradores.

Finalmente, y tras varias horas de investigación, descubrí que el problema no estaba en el código PHP sino en la codificación del fichero. En nuestro caso, estábamos usando UTF-8, con el pequeño detalle de que en esos dos ficheros, el Byte-order Mark (BOM para los amigos) estaba activo. El BOM (si está activo, ya que es opcional) es el primer byte del fichero y sirve para indicar si los datos se almacenan como Little Endians o Big Endians.

El detalle que me despistó totalmente (haciéndome pensar que era un problema de configuración de servidor o similar) fue que el mismo código funcionara en dos servidores, pero no en el tercero. Afortunadamente, una muesca más en la lista de “bugs” eliminados.

El extraño caso del Error 500 en WordPress

0 comments

Posted on 26th August 2010 by Luis M. in Blogs |Español |Informática |WordPress

Demasiado tiempo sin escribir, ya va siendo hora de retomar el proyecto…

La semana pasada el blog de nuestro amigo Jose Manuel dejó de funcionar misteriosamente. Cualquier petición al sistema de WordPress devolvía un error 500 (Internal Server Error).

La fuente del problema no estaba finalmente en el código de WordPress, sino en el directorio donde se encontraba el blog. Por alguna razón extraña, al borrar un sub-directorio, el directorio principal quedó corrupto y ésa era la razón del error 500. El problema se resolvió “simplemente” renombrando el directorio corrupto (lo podíamos haber borrado ya que teníamos una copia local), y copiando todo el contenido en un directorio nuevo con el mismo nombre que el original. El sistema WordPress salió andando inmediatamente con todo el contenido intacto, ya que la base de datos no se había visto afectada.

Una de las cosas que probamos en nuestro periplo fue actualizar WordPress manualmente (no teníamos acceso al sistema de administración para hacerlo automáticamente). Los pasos a seguir están muy bien explicados en este artículo del Codex de WordPress. Desafortunadamente, una vez terminado el proceso, no recobramos el control del blog y el error 500 seguía apareciendo (¡el problema no estaba en WordPress!).

Otra de las cosas positivas que hemos sacado ha sido este artículo de Kyle Robinson sobre los plug-in de WordPress para gestionar un sistema de caché. El problema inicial surgió porque es plug-in que estaba instalado (wp-cache) estaba empezando a ocupar demasiado espacio. Como Kyle explica en su artículo, se trata de un plug-in antiguo cuya última actualización se hizo en septiembre de 2007. Además, el directorio donde se guardan las páginas en la caché (llamado también wp-cache) se encuentra en la raíz de la instalación WordPress, al mismo nivel que wp-content (en lugar de estar en el directorio del propio plug-in) y la desinstalación del plug-in no borra todos esos archivos.

Como dice el dicho, “bien está lo que bien acaba”. “Sólo el balón es redondo” vuelve a estar en línea para regocijo de sus lectores (y alivio de su autor ;)  ). Por cierto, una de mis secciones favoritas de su sitio web es la narración de la batalla de Talavera de 1809 cuya lectura recomiendo fervorosamente.

El nuevo iPad

0 comments

Posted on 27th January 2010 by Mercedes in Español |Informática

Esta mañana, Steve Jobs ha presentado el nuevo “gadget” de Apple: el iPad. Como siempre, había mucha espectación ante la presentación, aunque los rumores apuntaban desde hacía días a un  “tablet” como nuevo cacharrito Apple.

A primera vista parece un iPod Touch grande. Con una pantalla de 9.7 pulgadas, y tactil, en el que todo va a funcionar a base de las aplicaciones que se pueden comprar en el App Store.  Por supuesto, y como todos los aparatos de Apple, viene con bastantes aplicaciones ya cargadas, como Safari, Photos, Mail, iTunes… y la aplicación que más me interesa,  iBook. Es una aplicación gratuita, que va a permitir usar el iPad como lector de libro electrónico. Acompañando a la aplicación, viene la iBookstore, donde se podrán comprar los libros. Según han dicho en la presentación, el formato será ePub, con lo que queda por ver si dejarán usar los libros comprados en otros dispositivos, o, al revés, si se podrán comprar libros en otras tiendas y usarlos en el iPad.

El precio del modelo más básico en Estados Unidos es de 499$, está por definir los precios en otros países. Hay dos modelos, con WiFi sólo o con WiFi y 3G. Para este último modelo han cerrado un acuerdo con AT&T (de nuevo en Estados Unidos) para ofrecer dos planes: 250MBytes por 14.99$ al mes o uso ilimitado por 29.99$ al mes. Estos planes sí que son noticia, ya que el uso de 3G suele ser bastante caro en USA. De nuevo, para el resto del planeta está por ver los acuerdos a los que llegan.

Para los desarrolladores de aplicaciones, han publicado la versión beta del SDK para iPhone (versión 3.2), con las funcionalidades del iPad incluidas.

No tengo demasiado claro si el iPad tendrá el mismo éxito que en su día tuvieron los iPod o iPhone. Habrá que seguir la evolución del mercado, pero no veo la ventaja de tener este aparato frente a un netbook o los propios portátiles de Apple. En cuanto a la funcionalidad de libro electrónico, hay otros lectores en el mercado como el eReader de Sony o el Kindle de Amazon, que tienen las funcionalidades que se le piden a un lector. A mí, como decía al principio del post, me parece un iPod Touch con la pantalla grande, pero no veo qué aporta exactamente de nuevo. No me han convencido esta vez para comprármelo en cuanto pueda. Creo que esperaré y probablemente invertiré en un nuevo modelo de eBook.