Archivo de la categoría: debug

Druplicon

Instalar y configurar xhprof para que funcione en Drupal.

El modulo Devel nos proporciona una buena forma de integrar xhprof en nuestra instalación de drupal, y vamos a aprovecharla.

Xhprof para quien no lo conozca aun, es un profiler. Principalmente nos permite saber de forma detallada cuanta ram, cpu y tiempo han consumido cada una de las funciones que se utilizan en un request.
De esta forma podemos centrarnos en las funciones mas conflictivas y resolver sus cuellos de botella.

Si se van a la configuración de Devel podemos ver que la opción esta deshabilitada

Y es solo porque no tenemos xhprof  instalado, asi que manos a la obra:

NOTA: Los pasos de instalación los hice en D7 sobre Ubuntu, pero son compatibles con cualquier *nix siempre que se adapten las rutas de las carpetas a las que utilicé el SO sobre el que quieras instalarlo.

Primero instalemos xhprof desde su código fuente. con la consola en mano te vas a tu home (por decir algún lado) y lanzamos:

wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd ./xhprof-0.9.2/extension/
phpize
./configure --with-php-config=/usr/bin/php-config
make
make install

Configuremos PHP para que use xhprof:

nano /etc/php5/conf.d/xhprof.ini

Y pegar esto dentro:

extension=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"

Listo, ya tenemos instalado xhprof.
Ahora creemos el directorio en el que se van a generar los dump (cada request genera un archivo de dump con toda la informacion registrada):

mkdir -p /var/tmp/xhprof
chown www-data. /var/tmp/xhprof

Bien, ahora dentro de la carpeta que contiene el codigo fuente que usamos hace un momento para hacer la instalacion, tenemos que copiar las carpetas “xhprof_html” y “xhprof_lib” en “/usr/share/php/“:

cp -Pr xhprof_html/* /usr/share/php/xhprof_html/
cp -Pr xhprof_lib/* /usr/share/php/xhprof_lib/

Xhprof genera graficos que son de mucha ayuda a la hora de identificar cuellos de botella y para crearlos utiliza las capacidades del programa graphviz. si no lo tenés instalado poder hacerlo lanzando:

apt-get install graphviz

Ok terminamos con la configuracion de xhprof. configuremos el resto del entorno para que pueda hacer uso de el.
Lo siguiente es crear un vhost para poder acceder a la informacion que genere xhprof:

nano /etc/apache2/sites-available/xhprof

Y pegas esto:

<virtualhost localhost:9999>
   DocumentRoot /usr/share/php/xhprof_html
   DirectoryIndex index.php
   <directory /usr/share/php/xhprof_html>
     AllowOverRide all
     Options FollowSymLinks
   </directory>
</virtualhost>

Nuestro vhost corre en el puerto 9999 asi que tenemos que agregarlo a apache:

nano /etc/apache2/ports.conf

debajo de “Listen 80” agrega:

Listen 9999

Estamos por teninar. Habilita el vhost que hemos creado con el comando “a2ensite xhprof“, reinicia apache con “service apache2 restart” y en nuestra instalación de Drupal 7 vayamos a “admin/config/development/devel” para configurarlo:

Ahora ves que ya podes marcar la opcion “Enable profiling of all page views and drush requests.


Cuando la marques vas a tener que rellenar:
xhprof directory:” ponele “/usr/share/php” (sin comillas)
XHProf URL:” ponele “http://localhost:9999” (sin comillas)

Y listo. ya lo tenes integrado en drupal. si miras en la parte inferior izquierda de cualquier pagina de la instalacion de tu drupal vas a ver que aparece un link llamado “XHProf output que te va a llevar a la pagina informativa del perfilado que se hiso.

 

 

Bonus!:

Nota: solo por cuestiones de mantenimiento te comento que los dump que genera xhprof en la carpeta “/var/tmp/xhprof” tienden a comerse el disco en cuestion de dias. la solucion que uso es lanzar un cron que limpia todos los dump que tengan mas de un dia.

El cron es un archivo con permisos de ejecucion y el siguiente contenido

#!/bin/bash
#Elimina todos los perfilados que tengan mas de 1 día
find /var/tmp/xhprof -type f -mtime +1 -exec rm -f {} \;

Guardalo en /etc/cron.daily/xhprof_cleaner.sh y listo.

Una nota final. La configuracion que explique no tiene en cuenta la seguridad. esto quiere decir que no deberias utilizarla en produccion salvo que sepas lo que haces.

debug

Instalar Xdebug en Ubuntu (cualquier versión)

Esto es mas bien un resumen de las instrucciones que nos deja el mismo creador de Xdebug en su pagina (http://xdebug.org/docs/install) mas un par de cosas que da por entendido que debemos saber :)

1) Lo primero es bajarse el código fuente de la ultima versión de Xdebug (la 2.1 es la ultima al día de la fecha)

http://xdebug.org/files/xdebug-2.1.0.tgz

2) Descompriman el archivo en una carpeta cualquiera

De acá en mas solo nos queda compilar configurar y probar:

3) Lancen el siguiente comando para asegurarse que tienen instaladas las librerías de desarrollo de php5 que son necesarias para poder compilar Xdebug:

apt-get install php5-dev

4) Entren en la carpeta por medio de la consola:

cd /ruta/a/la/carpeta/donde/descomprimiste/los/archivos/fuente/de/xdebug/xdebug-2.1.0/

5) Lanzar el comando phpize

phpize

6) Lanzar:

./configure --enable-xdebug
make
sudo make install

Al final del infierno de outputs de salen en la consola van a apreciar que se dibuja un recuadro como el que se ve en la siguiente imagen:

Bueno, justo encima de ese recuadro pueden ver que dice algo como “Installing shared extensions: /usr/lib/php5/20090626+lfs/“. Copien esa ruta.

Ya esta instalado Xdebug. Configuremos lo XD.

7) Editemos php.ini

sudo gedit /etc/php5/apache2/php.ini

Y en la ultima linea del archivo pequen lo siguiente:

zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

NOTA: en la linea que dice “zend_extension” reemplacen la ruta del ejemplo por la que copiaron en el paso 6

8) Listo! todo en teoría funciona. para comprobarlo abran el IDE al que le tengan mas bronca y configurenlo!

Druplicon

Como ver las variables disponibles en una plantilla .tpl.php (PHPTemplate)

Otro de esos TIP que nos vienen sorprendente mente bien :).

Si estas haciendo debug sobre una plantilla y necesitas saber cuales son las variables de las que dispones sobre la misma, te habras dado con el problema de que no se pueden ver. Osea, las variables existen, y si las mandas a imprimir con un echo() seguro que ahi está, pero hasta que no lo haces no podes saber siquiera que existe.

Bueno basta de intro, vamos a un ejemplo rapido y claro:

Si pones esta función en la plantilla que querés investigar, vas a poder ver un array ($variablesDisponibles para este ejemplo) de los nombres de todas las variables de las que dispone (y de sus contenidos también):

$variablesDisponibles = get_defined_vars();

Chau!

Druplicon

Drupal 6: Mostrar los errores de PHP en lugar de la pantalla blanca (o blank page)

Suele hacer falta poder ver los errores de PHP en Drupal de vez en cuando.

Abrí el archivo index.php de Drupal y poné lo siguiente justo por encima de “require_once ‘./includes/bootstrap.inc';“:

<?php
//Reportar errores PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//Fin reportar errores PHP
debug

Configurar Xdebug en Xampp 1.7.3 con PHP 5.3.1

Si querés configurar Xdebug en linux puede interesarte el post “Instalar Xdebug en Ubuntu (cualquier versión)

Vayan a la carpeta en la que esta instalado Xampp y entren en la carpeta de PHP.
Abran php.ini y busquen:

;zend_extension = "\xampp\php\ext\php_xdebug.dll"

Quítenle el punto y coma del principio para descomentarlo (Habilitarlo).

Ahora solo queda configurar los parámetros de Xdebug:
Busquen ahora “[XDebug]“. Lo que ven por debajo de esta etiqueta es su configuración, como se que es una putada tener que andar leyendo y habilitando uno a uno les dejo una configuración funcional para que la usen. (Borren todo lo que hay por debajo de la etiqueta [xdebug] antes de pegar esta nueva configuración).

[XDebug]
xdebug.auto_trace = 0
xdebug.collect_includes = 1
xdebug.collect_params = 1
xdebug.collect_return = 1
xdebug.collect_vars = "On"
xdebug.default_enable = "On"
xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump_globals = 1
xdebug.dump_once = 1
xdebug.dump_undefined = 0
xdebug.extended_info = 1
xdebug.file_link_format = ""
xdebug.manual_url = "http://www.php.net"
xdebug.max_nesting_level = 100
xdebug.overload_var_dump = 1
xdebug.profiler_append = 0
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "\xampp\tmp"
xdebug.profiler_output_name = "xdebug_profile.%p"
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_mode = "req"
xdebug.remote_port = 9000
xdebug.show_exception_trace = 0
xdebug.show_local_vars = 0
xdebug.trace_output_dir = "\xampp\tmp"
xdebug.var_display_max_children = 256
xdebug.var_display_max_data = 512
xdebug.var_display_max_depth = 10

Listo, de acá en mas solo tienen que configurar su eclipse, netbeans, o lo que sea que usen.