Guía 34 – Método básico para depuración código – DEBUG

Normalmente utilizo un entorno IDE para depurar el código generado por PHPRunner (MS Visual Studio y Netbeans PHP).

Esto sólo lo puedo hacer en mi PC, ya que en él configuro el Apache y el entorno de PHP a lo que necesito, pero esto no lo puedo hacer en los server en dónde subo las aplicaciones y donde no tengo el control de todo el entorno.

Para estos casos donde no puedo configurar mi IDE y también, para aquellos usuarios que aún no han dado el paso a disponer de un IDE para la depuración de PHP, podemos utilizar un método muy sencillo que voy a explicaros.

El método consiste en escribir en un fichero (en este caso llamado “error.log”) que es accesible desde cualquier navegador. De esta forma, todo lo que escribamos en dicho fichero podremos consultarlo y nos dará la pista de nuestros problemas.

Para montar es sistema tenemos que hacer:

  1. Crear un fichero llamado “error.log” en la raíz de nuestro proyecto. Por ejemplo, si mi proyecto está un path del tipo “../apache/htdoc/proyecto1”, crearemos el fichero “../apache/htdoc/proyecto1/error.log”
  2. En nuestro proyecto de PHPRunner introduciremos este código en el evento “After application initialized”. Este evento se ejecuta en todas las peticiones que hagamos a la aplicación.
    // To debug PHP code on the server
    function custom_error($number,$text){ // Function to produce the error file
    global $debugCode;
    if ($debugCode == true ) {
        $ddf = fopen(__DIR__ .'/../error.log','a');
        fwrite($ddf,"[".date("r")."] Error $number: $text\r\n");
        fclose($ddf);
      }
    }
    $debugCode = true;
    custom_error(1,"URL ejecutada: ".$_SERVER["REQUEST_URI"]); // To debug

    Si queremos que no escriba nuevas trazas pondremos la variable $debugCode a false.
    También borraremos el fichero “error.log” en los sistemas de Producción.

  3. Cada vez que deseemos escribir el contenido de variable u objeto utilizaremos la función custom_error(). Por ejemplo (ver qué SQL se está ejecutando. incluir en el evento “Before SQL query”:
    custom_error(2,"SQL de v_resource: ".$strSQL); // To debug 
    custom_error(2,"WHERE de v_resource: ".$strWhereClause); // To debug

El resultado del fichero es como este:

[Thu, 03 Feb 2022 13:03:16 +0100] Error 1: URL ejecutada: /project2/menu.php
[Thu, 03 Feb 2022 13:03:18 +0100] Error 1: URL ejecutada: /project2/menu.php
[Thu, 03 Feb 2022 13:05:22 +0100] Error 1: URL ejecutada: /project2/v_resource_list.php
[Thu, 03 Feb 2022 13:05:22 +0100] Error 2: SQL de v_resource: SELECT
`t1`.`task_id`, `t3`.`user_task_id`, `t1`.`projects_project_id`, `t5`.`companies_company_id`, `t5`.`departments_dept_id`, `t5`.`short_name`, `t1`.`parent`, `t1`.`name`, CASE  		WHEN (t1.percent_complete = 100 )THEN 3      WHEN (t1.end_date < now() and t1.percent_complete < 100 )THEN 2      WHEN (t1.end_date > now() and t1.start_date < now() )THEN 1      ELSE 0  END as `flag`, `t1`.`milestone`, `t1`.`start_date`, `t1`.`duration`, `t1`.`duration_type`, DATEDIFF(t1.end_date,t1.start_date)+1 as `natural_days`, `t1`.`hours_worked`, `t1`.`end_date`, `t1`.`status`, `t1`.`percent_complete`, `t1`.`description`, `t1`.`related_url`, `t1`.`creator`, `t1`.`order`, `t1`.`level`, `t1`.`dynamic`, `t1`.`access`, `t1`.`notify`, `t1`.`contacts`, `t1`.`custom`, `t1`.`type`, `t1`.`updator`, `t1`.`created`, `t1`.`updated`, `t1`.`dependent`, `t1`.`actual_end_date`, `t3`.`users_user_id` as `t3_users_user_id`, `t3`.`type` as `t3_type`, `t3`.`perc_assignment`, `t3`.`user_task_priority`, `t4`.`login`, `t4`.`username` 
 FROM `tasks` `t1`
 INNER JOIN `projects` `t5` ON t5.project_id = t1.projects_project_id
 INNER JOIN `user_tasks` `t3` ON t3.tasks_task_id = t1.task_id
 INNER JOIN `users` `t4` ON t4.user_id = t3.users_user_id   
[Thu, 03 Feb 2022 13:05:22 +0100] Error 2: WHERE de v_resource: 
[Thu, 03 Feb 2022 13:05:23 +0100] Error 1: URL ejecutada: /project2/timeline_ajax_event.php?start=2022-02-01T00%3A00%3A00%2B01%3A00&end=2022-03-01T00%3A00%3A00%2B01%3A00

Si lo que deseamos es imprimir un Array o un Object, se utilizará la función “print_r”. Por ejemplo si el array es la variable $ar, la impresión será print_r($a,true);

Espero que os sea útil y para cualquier ayuda o sugerencia podéis contactar conmigo a través de mi email [email protected]

 

Blog personal para facilitar soporte gratuito a usuarios de PHPRunner