La salida de error_log() para print_r() aparece en la página

17 dic 2017, 01:21:49
Vistas: 32.7K
Votos: 12

Estoy intentando depurar un plugin y estoy usando error_log() en varios lugares para ver diferentes variables. Estoy usando lo siguiente:

error_log( print_r( $variable ) );

Cuando miro el archivo debug.log, todo lo que veo es 1 y la salida real de la función error_log() se envía al navegador.

Sé que no es otro plugin el que está causando esto ya que todos están desactivados excepto el que estoy desarrollando. En mi archivo wp-config.php, he definido WP_DEBUG_DISPLAY como false.

Lo mismo sucede si uso var_dump() y var_export(). Otras funciones como gettype() funcionan perfectamente.

¿Hay alguna manera de obtener la salida en el archivo debug.log?

0
Todas las respuestas a la pregunta 3
1
22

La función print_r acepta un segundo parámetro para return que hace que retorne la variable en lugar de imprimirla.

print_r($expression, $return)

Así que puedes hacer

error_log( print_r( $variable, true ) );
17 dic 2017 01:36:29
Comentarios

Gracias. Supuse que sería algo tan simple que se me estaba pasando por alto :)

Cedon Cedon
17 dic 2017 02:17:09
0

Si tu variable es solo una cadena de texto, entonces puedes simplemente usar error_log ( $variable ). Si es un objeto o un array, además de usar print_r(), también puedes serializarlo:

error_log ( serialize ( $variable ) );
17 dic 2017 11:15:48
0

Si bien la respuesta aceptada es correcta, quería incluir una respuesta que amplíe la explicación para mayor claridad.

print_r() acepta dos argumentos (consulta la documentación de esta función), el segundo de los cuales es opcional y has omitido. El primer argumento es la expresión que se imprimirá. El segundo especifica si el valor se devuelve o se imprime.

Cuando se omite el segundo argumento, su valor predeterminado es false y, por lo tanto, imprime el resultado inmediatamente. Si este argumento es falso, print_r() devolverá true (que se muestra como "1" en el registro de errores).

$result = print_r( $variable );

El resultado devuelto aquí es true (mostrado como "1").

Estás pasando el resultado devuelto de print_r() a error_log(). Por la razón descrita anteriormente, este resultado es "1" y es por eso que obtienes 1 como entrada en el registro.

Para obtener un resultado que contenga la expresión en $variable y pasarla a la función error_log(), necesitas que print_r() devuelva la expresión como resultado. Puedes hacer eso especificando el segundo argumento como TRUE.

$result = print_r( $variable, true );

Ahora el resultado devuelto de print_r() es la expresión contenida en $variable y puedes pasarla a error_log():

$result = print_r( $variable, true );
error_log( $result );

O:

error_log( print_r( $variable, true ) );

Si deseas llevar esto un paso más allá, podrías escribir una función de utilidad para escribir en el registro que maneje determinar si $variable era un array o un objeto y, por lo tanto, requería print_r(), o si podía pasarse simplemente como una cadena. Esto facilita el manejo del registro de depuración, ya que no tienes que preocuparte por el tipo de variable para pasarlo al registro. He escrito una utilidad junto con una explicación detallada aquí.

Nota adicional sobre las funciones de PHP que mencionaste: No importa cuán experimentado seas, siempre es útil revisar la documentación de las funciones que estás utilizando para asegurarte de saber lo que realmente hacen. He enlazado a la documentación de print_r() anteriormente, que describe exactamente lo que se habló tanto en esta respuesta como en la respuesta aceptada. Pero también se mencionaron algunas otras funciones de PHP que funcionaron o no. Consideremos esas:

var_dump(): La documentación indica que esta función no devuelve un resultado. Para pasar algo a error_log() para incluirlo en el registro de errores, debe ser una expresión contenida en una variable. Esta función no devuelve nada, solo imprime en la pantalla. Por lo tanto, no puedes usarla para pasar algo a error_log().

var_export(): Similar a print_r() en que tienes un segundo argumento opcional para devolver un resultado o imprimir en pantalla. Define el segundo argumento como true para poder devolver un resultado para error_log().

gettype() siempre devuelve el tipo de la variable. Por lo tanto, tienes algo que puedes pasar a error_log() por defecto. Es por eso que funcionó.

2 feb 2020 16:36:57