¿Cómo imprimir un registro de depuración?

129

Me gustaría depurar un código PHP, pero creo que imprimir un registro en la pantalla o archivo está bien para mí.

¿Cómo debo imprimir un registro en el código PHP?

Lo habitual print/ printfparece ir a la salida HTML, no a la consola.

Tengo un servidor Apache ejecutando el código PHP.

eugene
fuente
¿Su script se ejecuta en un navegador web o en una consola (también conocido como analizado usando php.exe en lugar de apache / iis)?
danielrsmith
Debería mirar esta pregunta, tiene un poco de código de registro útil: stackoverflow.com/questions/5769537/…
Ben
de que idioma vienes Solo para que tu php sea muy diferente a otros lenguajes compilados
Ibu
1
@lbu: de hecho ... no esperaba, la printfpregunta obtendría tantos votos positivos ...
eugene
error_log ($ string);
Thewebus

Respuestas:

186

Un truco menos conocido es que mod_php asigna stderr al registro de Apache. Y, hay una secuencia para eso, por file_put_contents('php://stderr', print_r($foo, TRUE))lo que volcará muy bien el valor de $fooen el registro de errores de Apache.

chx
fuente
1
A continuación, mencioné que, por cierto, también puede establecer el valor de error_log en 'php: // stdout' al depurar una aplicación de consola y hacer que los mensajes de error aparezcan directamente en la consola, es decir: error_log ("¡Se equivocó!", 3 , "php: // stdout");
stefgosselin
44
+1 Me tomó demasiado tiempo encontrar esta respuesta. Esto es todo lo que realmente estaba buscando. No pude averiguar cómo ver qué contenía mi matriz (trabajando en Drupal).
SteveS
También sugeriría usar en var_export($foo, true)lugar de print_r($foo, true)si print_rno le proporciona la información de tipo que necesita.
Ben
¿No sería lo mismo que error_log (print_r ($ foo)); ?
Brunis
143
error_log(print_r($variable, TRUE)); 

podría ser útil

Olivier Berger
fuente
2
Desafortunadamente, esta es la solución más conveniente. Xdebug es demasiado pesado para ejecutarlo todo el tiempo. Votado por ti
Phung D. Un
26

Puede usar error_log para enviar a sus servidores el archivo de registro de errores (u otro archivo opcional si lo desea)

pthurlow
fuente
21

Si estás en Linux:

file_put_contents('your_log_file', 'your_content');

o

error_log ('your_content', 3, 'your_log_file');

y luego en la consola

tail -f your_log_file

Esto mostrará continuamente la última línea puesta en el archivo.

usuario3029507
fuente
9

Necesitas cambiar tu estado de ánimo. Estás escribiendo PHP, no cualquier otra cosa que estés acostumbrado a escribir. La depuración en PHP no se realiza en un entorno de consola.

En PHP, tiene 3 categorías de soluciones de depuración:

  1. Salida a una página web (vea la biblioteca dBug para una mejor vista de las cosas).
  2. Escribir en un archivo de registro
  3. En sesión de depuración con xDebug

Aprenda a usarlos en lugar de tratar de hacer que PHP se comporte como cualquier otro lenguaje al que esté acostumbrado.

Sylverdrag
fuente
31
Como alguien que pasa mucho tiempo escribiendo aplicaciones de consola y varios scripts que no son web , cortésmente estaré en desacuerdo con eso.
stefgosselin
Trabajo mucho manteniendo y desarrollando aplicaciones de consola y, en mi mala interpretación en inglés de la pregunta, asumí que estaba buscando depurar una aplicación de consola. Xdebug está bien y es muy útil, aunque me gusta depurar información directamente en mi editor
stefgosselin
1
@Stefgosselin: Netbeans hace más o menos lo mismo, aunque lo mejor que he visto con xDebug fue con Aptana.
Sylverdrag
1
Uso xDebug en Netbeans y funciona bien la mayor parte del tiempo. Pero, hay momentos en que necesita registrar cosas en un archivo.
cosan
intente esto también ... ¡podrá hacer más! stackoverflow.com/a/44050914/2053479
ganesh
5

¿Estás depurando en la consola? Hay varias opciones para depurar PHP. La función más común utilizada para la depuración rápida y sucia es var_dump .

Dicho esto y fuera del camino, aunque var_dump es increíble y mucha gente hace todo con eso, hay otras herramientas y técnicas que pueden darle más sabor.

Cosas para ayudar si se depura en una página web, ajuste las <pre> </pre>etiquetas alrededor de su declaración de volcado para darle el formato adecuado en matrices y objetos.

Es decir:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

Y, por último, pero no menos importante, asegúrese de que la depuración de su manejo de errores esté configurada para mostrar errores. Puede ser necesario agregar esto en la parte superior de su script si no puede acceder a la configuración del servidor para hacerlo.

error_reporting(E_ALL);
ini_set('display_errors', '1');

¡Buena suerte!

Stefgosselin
fuente
2

Si no desea integrar un marco como Zend , puede usar el método trigger_error para iniciar sesión en el registro de errores de php.

jopke
fuente
2

Simplemente camino es trigger_error:

 trigger_error("My error");

pero no puede poner matrices u objetos, por lo tanto, use

var_dump
Danzan
fuente
trigger_error es probablemente la mejor manera de escribir en sus registros de errores. Te agradecerás a ti mismo cuando quieras modificar las líneas de registro con algunos datos personalizados más adelante.
Anshul
2

También puede escribir en un archivo como este:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Asegúrese de establecer los permisos adecuados para que php pueda acceder y escribir en el archivo ( 775).

inorganik
fuente
1

Puede usar el módulo php curl para hacer llamadas a http://liveoutput.com/ . Esto funciona muy bien en un entorno corporativo seguro donde existen ciertas restricciones en php.ini que restringen el uso de file_put_contents.

Steve K
fuente
1

Esta es una gran herramienta para depurar y registrar php: PHp Debugger & Logger

Funciona desde el primer momento con solo 3 líneas de código. Puede enviar mensajes a la consola js para la depuración de ajax y puede reemplazar el controlador de errores. También descarga información sobre variables como var_dump () e print_r (), pero en un formato más legible. Muy buena herramienta!

Charlie
fuente
1

He usado muchos de estos, pero dado que generalmente necesito depurar cuando desarrollo, y desde que desarrollo en localhost, he seguido los consejos de otros y ahora escribo en la consola de depuración de JavaScript del navegador (ver http: //www.codeforest. net / debugging-php-in-browsers-javascript-console ).

Eso significa que puedo mirar la página web que mi PHP está generando en mi navegador y presionar F12 para mostrar / ocultar rápidamente cualquier rastro de depuración.

Dado que constantemente estoy mirando las herramientas de desarrollador para depurador, diseño CSS, etc., tiene sentido mirar mi loggon PHP allí.

Si alguien nos decide ese código, hice un cambio menor. Después

function debug($name, $var = null, $type = LOG) {

yo añadí

$name = 'PHP: ' . $name;

Esto se debe a que mi servidor PHP genera HTML que contiene JavaScript y me resulta útil distinguir entre la salida de PHP y JS.

(Nota: actualmente estoy actualizando esto para permitirme activar y desactivar diferentes tipos de salida: desde PHP, desde JS y acceso a la base de datos)

Mawg dice que reinstalar a Mónica
fuente
1

Yo uso cakephp, así que uso:

$this->log(YOUR_STRING_GOES_HERE, 'debug');
mmv_sat
fuente
0

Puedes usar:

<?php
echo '<script>console.log("debug log")</script>';
?>
steffanjj
fuente
2
Esto tiene mucha sobrecarga. ¿Por qué invocar JavaScript para una salida de error simple?
clockw0rk
-8

Puedes usar

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

o si desea imprimir esa declaración en un registro, puede usar

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);
Duro
fuente
8
AddLog? Esta no es una función nativa.
stefgosselin