¿Cómo puedo escribir en la consola en PHP?

324

¿Es posible escribir una cadena o iniciar sesión en la consola?

Lo que quiero decir

Al igual que en JSP, si imprimimos algo así system.out.println("some"), estará allí en la consola, no en una página.

Labeeb Panampullan
fuente

Respuestas:

145

Firefox

En Firefox puede usar una extensión llamada FirePHP que permite el registro y descarga de información de sus aplicaciones PHP a la consola. Este es un complemento de la increíble extensión de desarrollo web Firebug .

Cromo

Sin embargo, si está utilizando Chrome, existe una herramienta de depuración de PHP llamada Chrome Logger o webug (webug tiene problemas con el orden de los registros).

Más recientemente Clockwork está en desarrollo activo, que amplía las Herramientas para desarrolladores al agregar un nuevo panel para proporcionar información útil de depuración y creación de perfiles. Proporciona soporte inmediato para Laravel 4 y Slim 2 y se puede agregar soporte a través de su API extensible.

Usando Xdebug

Una mejor manera de depurar tu PHP sería a través de Xdebug . La mayoría de los navegadores proporcionan extensiones auxiliares para ayudarlo a pasar la cadena de cookie / consulta requerida para inicializar el proceso de depuración.

Malaquías
fuente
55
También hay una extensión de Safari para depurar PHP llamada Xdebug Helper. Lo instalé desde esta página: extensiones.apple.com/#tab
Mark Mckelvie
3
El enlace PHP de Fire está muerto
Brian Leishman
99
echo "<script> console.log ('PHP:',", get_option ("slides_data"), "); </script>";
Azmat Karim Khan
44
OP afirma que quería imprimir en la salida estándar, no en la consola html / js.
beppe9000
66
FirePHP está oficialmente muerto.
TimSparrow
407

O usas el truco de PHP Debug para consolar .

Primero necesitas una pequeña función auxiliar de PHP

function debug_to_console($data) {
    $output = $data;
    if (is_array($output))
        $output = implode(',', $output);

    echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}

Entonces puedes usarlo así:

debug_to_console("Test");

Esto creará una salida como esta:

Debug Objects: Test
Senador
fuente
55
En FireFox v27 "Debug Objects: " . $data . ""
sale
La única forma de hacer que esto sea más útil sería hacer una variable $ name: par de 'datos' en el registro. Buena función sin embargo.
Imperativo
10
@Mawg (y las personas que votaron por ese comentario): si $dataaparece en la salida, entonces no ha escrito la función exactamente como se muestra. Mire cuidadosamente sus comillas simples y dobles, para asegurarse de que coincidan con el código anterior. $dataes una variable php; para cuando la página se envíe al navegador, esa variable php habrá sido reemplazada por el parámetro pasado a debug_to_console. El navegador nunca debería ver $data. (Si mira page sourceen el navegador, no debería decir $data).
ToolmakerSteve
1
Gracias por la pista de mi publicación. Pero el tiempo y el conocimiento han cambiado, la función también;) Lo tengo actualizado ahora.
bueltge
3
En otras palabras, la respuesta es esta: echo "<script> console.log ('Debug Objects:". $ Output. "'); </script>";
Christine
69

Si está buscando un enfoque simple, repita como JSON:

<script>
    console.log(<?= json_encode($foo); ?>);
</script>
Travis
fuente
44
Esto agrega un poco más de contexto:function debug_log( $object=null, $label=null ){ $message = json_encode($object, JSON_PRETTY_PRINT); $label = "Debug" . ($label ? " ($label): " : ': '); echo "<script>console.log(\"$label\", $message);</script>"; }
robrecord
OP afirma que quería imprimir en salida estándar, no en la consola html / js.
beppe9000
@ beppe9000 Eso es incorrecto. El OP le pregunta si puede escribir desde PHP a la consola. Cita: "¿Es posible escribir una cadena o iniciar sesión en la consola?"
Dawson Irvine
con esto puedes evitar var_dumps y similares. Funciona muy bien y la consola te permite alternar el json de una manera agradable.
Mbotet
41

Por defecto, todos los resultados van a stdout, que es la respuesta HTTP o la consola, dependiendo de si su script es ejecutado por Apache o manualmente en la línea de comando. Pero puede usarlo error_logpara iniciar sesión y se pueden escribir varias secuencias de E / S confwrite .

nikc.org
fuente
8
Gracias, error_loges lo que necesitaba para enviar al terminal desde el servidor web incorporado de PHP
Martín Coll
37

Intenta lo siguiente. Está funcionando:

echo("<script>console.log('PHP: " . $data . "');</script>");
Mandy
fuente
55
Esto no es en tiempo muy real, ya que php envía toda la página una vez que finaliza el procesamiento. Además, si hay un error en el archivo php, no podrá ver ninguno de los registros, ya que solo devolverá una página de error, ignorando así sus impresiones anteriores.
Miro Markaravanes
1
Me gustaría señalar que @MiroMarkaravanes es absolutamente correcto: los errores fatales pueden evitar que su console.log salga a menos que se asegure de manejar / detectar todos los errores posibles. Especialmente cuando se usa el búfer de salida: si el búfer no llega a la pantalla, tampoco lo hace la salida de console.log. Es algo a tener en cuenta.
whoshotdk
1
OP afirma que quería imprimir en salida estándar, no en la consola html / js.
beppe9000
19
echo 
"<div display='none'>
    <script type='text/javascript'>
        console.log('console log message');
    </script>
</div>";

Crea un

<div>

con el

display="none"

para que no se muestre el div, sino el

console.log()

La función se crea en JavaScript. Entonces recibes el mensaje en la consola.

Neo
fuente
3
Técnicamente, esta es la respuesta correcta a la pregunta inicial: cómo escribir en la consola del navegador desde PHP. Pero creo que el autor está tratando de depurar PHP para que haya mejores opciones. Sin embargo, no debe ser rechazado, estrictamente hablando, esta es una respuesta correcta.
Rolf
1
¡Ciertamente lo encontré increíblemente útil!
albert
Manteniéndolo simple, esta solución es excelente porque se explica por sí misma. Especialmente cuando tienes mucho que masticar al mismo tiempo que estoy pasando ahora.
Olu Adabonyan
2
No entiendo por qué incluso necesitas un div. Si solo tiene un <script>bloqueo, no se mostrará nada en el navegador.
Kodos Johnson
1
Además, si su mensaje de error se almacena en una variable, o si contiene comillas, haría bien en incluir el mensaje en una llamada para json.encodeque las comillas no rompan su línea de código. Por ejemplo:echo "<script>console.log(".json_encode($msg).")</script>";
SherylHohman
18

Como autor de la página web vinculada en la respuesta popular , me gustaría agregar mi última versión de esta función auxiliar simple. Es mucho mas solido.

Utilizo json_encode()para verificar si el tipo de variable no es necesario y también agrego un búfer para resolver problemas con marcos. No tiene un rendimiento sólido o un uso excesivo de header().

/**
 * Simple helper to debug to the console
 *
 * @param $data object, array, string $data
 * @param $context string  Optional a description.
 *
 * @return string
 */
function debug_to_console($data, $context = 'Debug in Console') {

    // Buffering to solve problems frameworks, like header() in this and not a solid return.
    ob_start();

    $output  = 'console.info(\'' . $context . ':\');';
    $output .= 'console.log(' . json_encode($data) . ');';
    $output  = sprintf('<script>%s</script>', $output);

    echo $output;
}

Uso

// $data is the example variable, object; here an array.
$data = [ 'foo' => 'bar' ];
debug_to_console($data);`

Captura de pantalla del resultado.

También un ejemplo simple como imagen para entenderlo mucho más fácilmente:

Ingrese la descripción de la imagen aquí

bueltge
fuente
Mientras yo hago como esta idea, se puede confirmar que no sería adecuado para las peticiones Ajax?
Mawg dice que reinstalar a Monica el
1
Sí, es puro php estático, no Ajax.
bueltge
Pero, parece estar agregando código HML / JS a un cuerpo de página, y mi Ajax no devuelve ningún cuerpo de página. Lo siento, pero no entiendo y thansk por intentar ayudarme
Mawg dice que reinstale a Monica el
1
Debe activar la función auxiliar antes de solicitar la llamada ajax, luego obtendrá también un resultado en la consola.
bueltge
Así que puse una variable allí y cada personaje terminó en su propia línea. ¿Es curioso saber por qué está haciendo eso? Nunca usé
console.info
17

Creo que se puede usar

function jsLogs($data) {
    $html = "";
    $coll;

    if (is_array($data) || is_object($data)) {
        $coll = json_encode($data);
    } else {
        $coll = $data;
    }

    $html = "<script>console.log('PHP: ${coll}');</script>";

    echo($html);
    # exit();
}

# For String
jsLogs("testing string"); #PHP: testing string

# For Array
jsLogs(array("test1", "test2")); # PHP: ["test1","test2"]

# For Object
jsLogs(array("test1"=>array("subtest1", "subtest2"))); #PHP: {"test1":["subtest1","subtest2"]}
Pankaj Bisht
fuente
3
Muy sofisticado. Gracias @Pankaj Bisht
Vickar
2
Una explicación estaría en orden.
Peter Mortensen
14

Algunas excelentes respuestas que agregan más profundidad; pero necesitaba algo más simple y más parecido al JavaScriptconsole.log() comando .

Utilizo PHP en una gran cantidad de "recopilación de datos y convertir en XML" en aplicaciones Ajax. El JavaScript console.logno funciona en ese caso; rompe la salida XML.

Xdebug, etc. tuvo problemas similares.

Mi solución en Windows:

  • Configure un .txtarchivo que sea fácil de acceder y que se pueda escribir
  • Establezca la error_logvariable PHP en el .iniarchivo para escribir en ese archivo
  • Abra el archivo en el Explorador de archivos de Windows y abra un panel de vista previa.
  • Usa el error_log('myTest');comando PHP para enviar mensajes

Esta solución es simple y satisface mis necesidades la mayor parte del tiempo. PHP estándar, y el panel de vista previa se actualiza automáticamente cada vez que PHP escribe en él.

Klompenrunner
fuente
¿Ajustar el mensaje json_encodetambién resolvería el problema? Si es así, puede ser que las comillas dentro del mensaje interfieran con las comillas en el script. (por ejemplo:) echo "<script>console.log(".json_encode($msg).")</script>";. De lo contrario, tengo curiosidad por saber cuál fue el problema que causó que el script console.log se rompiera y cómo / por qué su solución lo solucionó. Su solución es buena: solo estoy tratando de aprender más sobre las condiciones que causaron la console.logruptura de la salida xml. En muchos casos, un registro de errores como lo hizo es mucho mejor que uno rápido console.log.
SherylHohman
13
$variable = "Variable";
echo "<script>console.log('$variable');</script>";

Interacción PHP y JavaScript.

0DAYanc
fuente
Una explicación estaría en orden. ¿Puedes dar más detalles ( editando tu respuesta , no respondiendo en comentarios)?
Peter Mortensen
11

Esto me parece útil:

function console($data, $priority, $debug)
{
    if ($priority <= $debug)
    {
        $output = '<script>console.log("' . str_repeat(" ", $priority-1) . (is_array($data) ? implode(",", $data) : $data) . '");</script>';

        echo $output;
    }
}

Y úsalo como:

<?php
    $debug = 5; // All lower and equal priority logs will be displayed
    console('Important', 1 , $debug);
    console('Less Important', 2 , $debug);
    console('Even Less Important', 5 , $debug);
    console('Again Important', 1 , $debug);
?>

Qué salidas en la consola:

Important
 Less Important
     Even Less Important
Again Important

Y puede desactivar los registros menos importantes limitándolos con el valor $ debug.

zee
fuente
Entonces, si llamas a console('Even Less Important' ,6 , $debug);esto, ¿no se mostrará en la consola? ¿porque? ¿No se muestra nada por encima de 5?
HattrickNZ
2
@HattrickNZ Esto es para permitirle tener diferentes niveles de mensajes de registro. Si está depurando, es posible que desee mostrar un flujo de mensajes muy hablador con mucha información, sin embargo, durante las operaciones normales, puede establecer la depuración en 1 para que solo se muestren los errores / elementos de registro más importantes. Depende de usted decidir qué elementos son importantes al escribir el código.
Toby Allen
OP afirma que quería imprimir en salida estándar, no en la consola html / js.
beppe9000
1
Sí, pero el código repetido (redundancia) debe ser refactorizado: $output = '<script>console.log("' . str_repeat(" ", $priority-1)y . '");</script>';. Solo implode(",", $data)y $dataes diferente.
Peter Mortensen el
1
@ Peter Mortensen - ¡historia real! Editado esto en 4yo post! :)
zee
7

Corto y fácil, para matrices, cadenas o también objetos.

function console_log( $data ) {
  $output  = "<script>console.log( 'PHP debugger: ";
  $output .= json_encode(print_r($data, true));
  $output .= "' );</script>";
  echo $output;
}
Carlos lugo
fuente
1
OP afirma que quería imprimir en el terminal del lado del servidor / salida estándar, no en la consola html / js.
beppe9000
7
function phpconsole($label='var', $x) {
    ?>
    <script type="text/javascript">
        console.log('<?php echo ($label)?>');
        console.log('<?php echo json_encode($x)?>');
    </script>
    <?php
}
ashraf mohammed
fuente
1
OP afirma que quería imprimir en el terminal del lado del servidor / salida estándar, no en la consola html / js.
beppe9000
7

Si desea escribir en el archivo de registro de PHP, y no en la consola de JavaScript, puede usar esto:

error_log("This is logged only to the PHP log")

Referencia: error_log

Dan Green-Leipciger
fuente
Luego salta en ssh y sigue el registro
Hayden Thring
6

Para Chrome hay una extensión llamada Chrome Logger permite registrar mensajes PHP.

Las DevTools de Firefox incluso tienen soporte integrado para el protocolo Chrome Logger .

Para habilitar el registro, solo necesita guardar el archivo 'ChromePhp.php' en su proyecto. Entonces se puede usar así:

include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');

Ejemplo tomado de la página de GitHub .

La salida puede verse así:

Registro del servidor dentro de Firefox DevTools

Sebastian Zartner
fuente
También puede instalarlo a través del compositor:"ccampbell/chromephp": "*"
padawanTony
5

También hay una gran extensión de Google Chrome, Consola PHP , con una biblioteca PHP que le permite:

  • Ver errores y excepciones en la consola de JavaScript de Chrome y en las ventanas emergentes de notificación.
  • Volcar cualquier tipo de variable.
  • Ejecuta código PHP de forma remota.
  • Proteger el acceso por contraseña.
  • Agrupe los registros de la consola por solicitud.
  • Salta a error file:line en tu editor de texto.
  • Copie los datos de error / depuración en el portapapeles (para probadores).
barbushin
fuente
1
Mi método preferido para escribir errores PHP, excepciones y resultados de depuración definidos por el usuario en la consola JS. Lo he estado usando durante años, altamente confiable y actualizado con las revisiones de PHP. No usaría nada más.
Velojet
3

Estaba buscando una forma de depurar código en un complemento de WordPress que estaba desarrollando y encontré esta publicación.

Tomé los bits de código que me son más aplicables de otras respuestas y los combiné en una función que puedo usar para depurar WordPress. La función es:

function debug_log($object=null, $label=null, $priority=1) {
    $priority = $priority<1? 1: $priority;
    $message = json_encode($object, JSON_PRETTY_PRINT);
    $label = "Debug" . ($label ? " ($label): " : ': ');
    echo "<script>console.log('" . str_repeat("-", $priority-1) . $label . "', " . $message . ");</script>";
}

El uso es el siguiente:

$txt = 'This is a test string';
$sample_array = array('cat', 'dog', 'pig', 'ant', 'fly');
debug_log($txt, '', 7);
debug_log($sample_array);

Si esta función se usa con el desarrollo de WordPress, la función se debe colocar en el functions.phparchivo del tema secundario y luego se puede invocar en cualquier parte del código.

Clinton
fuente
2

He abandonado todo lo anterior en favor de Debugger & Logger . No puedo alabarlo lo suficiente!

Simplemente haga clic en una de las pestañas en la parte superior derecha, o en el "clic aquí" para expandir / ocultar.

Observe las diferentes "categorías". Puede hacer clic en cualquier matriz para expandirla / contraerla.

Desde la página web

Principales características:

  • Mostrar variables globales ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE, etc.)
  • Mostrar la versión de PHP y las extensiones cargadas
  • Reemplazar PHP integrado en el controlador de errores
  • Registrar consultas SQL
  • Monitorear el código y el tiempo de ejecución de consultas SQL
  • Inspeccionar variables por cambios
  • Función de seguimiento de llamadas
  • Análisis de cobertura de código para verificar qué líneas de script se ejecutaron
  • Volcado de todos los tipos de variables
  • Inspector de archivos con resaltador de código para ver el código fuente
  • Enviar mensajes a la consola de JavaScript (solo Chrome), para scripts de Ajax

Ingrese la descripción de la imagen aquí

Mawg dice que reinstalar a Mónica
fuente
Hola. ¿Existe una nueva bifurcación o herramienta similar más actualizada y actualmente mantenida?
Metafaniel
No lo codifiqué, así que para el tenedor más nuevo, supongo que solo ir a GitHub. Para alternativas, pregunte en softwarerecs.stackexchange.com y lo ayudaremos.
Mawg dice que reinstale a Mónica el
1
@MawgHi, gracias. Pregunté porque phptoolcase Github y las horquillas enumeradas allí no se han actualizado en 5 años. Gracias por el otro sitio de StackExchange. Acabo de encontrar un reloj . Me pregunto si es similar o mejor ...
Metafaniel
Y gracias a que por un reloj. Se ve excelente (es una pena que no use ninguno de esos marcos (me pregunto si así es como puede volcar las consultas de la base de datos, enganchando el marco)). Vale la pena investigarlo. (+1)
Mawg dice que reinstale a Mónica el
2

Para las llamadas Ajax o las respuestas XML / JSON, donde no desea meterse con el cuerpo, debe enviar registros a través de encabezados HTTP, luego agregarlos a la consola con una extensión web. Así es como FirePHP (ya no está disponible) y QuantumPHP (una bifurcación de ChromePHP) lo hacen en Firefox.

Si tiene paciencia, x-debug es una mejor opción: obtiene una visión más profunda de PHP, con la capacidad de pausar su script, ver lo que está sucediendo y luego reanudar el script.

Frank Forte
fuente
FirePHP ya no es viable .
Peter Mortensen
2

Puede que llegue tarde a una fiesta, pero estaba buscando una implementación de la función de registro que:

  • toma un número variable de argumentos separados por comas, al igual que JavaScript console.log() ,
  • da una salida formateada (no solo una cadena serializada),
  • es distinguible de un javascript común console.log().

Entonces la salida se ve así:

ingrese la descripción de la imagen aquí

(El fragmento a continuación se prueba en php 7.2.11. No estoy seguro de su compatibilidad con versiones anteriores de php. También puede ser un problema para JavaScript (en términos de navegadores antiguos), porque crea una coma final después de los console.log()argumentos, lo cual no es legal hasta ES 2017.)

<?php

function console_log(...$args)
{
    $args_as_json = array_map(function ($item) {
        return json_encode($item);
    }, $args);

    $js_code = "<script>console.log('%c 💬 log from PHP: ','background: #474A8A; color: #B0B3D6; line-height: 2',";
    foreach ($args_as_json as $arg) {
        $js_code .= "{$arg},";
    }
    $js_code .= ")</script>";

    echo $js_code;
}

$list = ['foo', 'bar'];
$obj = new stdClass();
$obj->first_name = 'John';
$obj->last_name = 'Johnson';

echo console_log($list, 'Hello World', 123, $obj);

?>
HynekS
fuente
Este fragmento me salvó. :) Necesitaba hacer algunos cambios en el código de producción sin acceso a los servidores reales, y esto fue perfecto para evitarlo. ¡Gracias!
Raphael Aleixo
Me alegro de haber podido ayudar.
HynekS
1

Cualquiera de estos dos está funcionando:

<?php
    $five = 5;
    $six = 6;
?>
<script>
    console.log(<?php echo $five + $six ?>);
</script>


<?php
    $five = 5;
    $six = 6;
    echo("<script>console.log($five + $six);</script>");
?>
roybraym
fuente
1

Aquí está mi solución, lo bueno de esta es que puedes pasar tantos parámetros como quieras.

function console_log()
{
    $js_code = 'console.log(' . json_encode(func_get_args(), JSON_HEX_TAG) .
        ');';
    $js_code = '<script>' . $js_code . '</script>';
    echo $js_code;
}

Llámalo de esta manera

console_log('DEBUG>>', 'Param 1', 'Param 2');
console_log('Console DEBUG:', $someRealVar1, $someVar, $someArray, $someObj);

Ahora debería poder ver la salida en su consola, feliz codificación :)

Imran Zahoor
fuente
0

Utilizar:

function console_log($data) {
    $bt = debug_backtrace();
    $caller = array_shift($bt);

    if (is_array($data))
        $dataPart = implode(',', $data);
    else
        $dataPart = $data;

    $toSplit = $caller['file'])) . ':' .
               $caller['line'] . ' => ' . $dataPart

    error_log(end(split('/', $toSplit));
}
btm1
fuente
1
Debe agregar una pista sobre su idea y solución. También la fuente tiene fuente no utilizada.
bueltge
0

Aquí hay una función útil. Es súper simple de usar, le permite pasar tantos argumentos como desee, de cualquier tipo, y mostrará el contenido del objeto en la ventana de la consola del navegador como si llamara console.log desde JavaScript, pero desde PHP

Tenga en cuenta que también puede usar etiquetas pasando 'TAG-YourTag', y se aplicará hasta que se lea otra etiqueta, por ejemplo, 'TAG-YourNextTag'

/*
 *  Brief:         Print to console.log() from PHP
 *
 *  Description:   Print as many strings,arrays, objects, and
 *                 other data types to console.log from PHP.
 *
 *                 To use, just call consoleLog($data1, $data2, ... $dataN)
 *                 and each dataI will be sent to console.log - note
 *                 that you can pass as many data as you want an
 *                 this will still work.
 *
 *                 This is very powerful as it shows the entire
 *                 contents of objects and arrays that can be
 *                 read inside of the browser console log.
 *
 *                 A tag can be set by passing a string that has the
 *                 prefix TAG- as one of the arguments. Everytime a
 *                 string with the TAG- prefix is detected, the tag
 *                 is updated. This allows you to pass a tag that is
 *                 applied to all data until it reaches another tag,
 *                 which can then be applied to all data after it.
 *
 *                 Example:
 *
 *                 consoleLog('TAG-FirstTag', $data, $data2, 'TAG-SecTag, $data3);
 *
 *                 Result:
 *                     FirstTag '...data...'
 *                     FirstTag '...data2...'
 *                     SecTag   '...data3...'
 */
function consoleLog(){
    if(func_num_args() == 0){
        return;
    }

    $tag = '';
    for ($i = 0; $i < func_num_args(); $i++) {
        $arg = func_get_arg($i);
        if(!empty($arg)){
            if(is_string($arg) && strtolower(substr($arg, 0, 4)) === 'tag-'){
                $tag = substr($arg, 4);
            }else{
                $arg = json_encode($arg, JSON_HEX_TAG | JSON_HEX_AMP );
                echo "<script>console.log('" . $tag . " " . $arg . "');</script>";
            }
        }
    }
}

NOTA: func_num_args () y func_num_args () son funciones de PHP para leer un número dinámico de argumentos de entrada, y permiten que esta función tenga infinitas solicitudes de console.log de una llamada de función.

Chris Sprague
fuente
0

Aunque esta es una vieja pregunta, he estado buscando esto. Aquí está mi compilación de algunas soluciones respondidas aquí y algunas otras ideas encontradas en otros lugares para obtener una solución única para todos.

CÓDIGO

    // Post to browser console
    function console($data, $is_error = false, $file = false, $ln = false) {
        if(!function_exists('console_wer')) {
            function console_wer($data, $is_error = false, $bctr, $file, $ln) {
                echo '<div display="none">'.'<script type="text/javascript">'.(($is_error!==false) ? 'if(typeof phperr_to_cns === \'undefined\') { var phperr_to_cns = 1; document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ alert("Alert. see console."); }, 4000); });  }' : '').' console.group("PHP '.(($is_error) ? 'error' : 'log').' from "+window.atob("'.base64_encode((($file===false) ? $bctr['file'] : $file)).'")'.((($ln!==false && $file!==false) || $bctr!==false) ? '+" on line '.(($ln===false) ? $bctr['line'] : $ln).' :"' : '+" :"').'); console.'.(($is_error) ? 'error' : 'log').'('.((is_array($data)) ? 'JSON.parse(window.atob("'.base64_encode(json_encode($data)).'"))' : '"'.$data.'"').'); console.groupEnd();</script></div>'; return true;
            }
        }
        return @console_wer($data, $is_error, (($file===false && $ln===false) ? array_shift(debug_backtrace()) : false), $file, $ln);
    }

    //PHP Exceptions handler
    function exceptions_to_console($svr, $str, $file, $ln) {
        if(!function_exists('severity_tag')) {
            function severity_tag($svr) {
                $names = [];
                $consts = array_flip(array_slice(get_defined_constants(true)['Core'], 0, 15, true));
                foreach ($consts as $code => $name) {
                    if ($svr & $code) $names []= $name;
                }
                return join(' | ', $names);
            }
        }
        if (error_reporting() == 0) {
            return false;
        }
        if(error_reporting() & $svr) {
            console(severity_tag($svr).' : '.$str, true, $file, $ln);
        }
    }

    // Divert php error traffic
    error_reporting(E_ALL);  
    ini_set("display_errors", 1);
    set_error_handler('exceptions_to_console');

PRUEBAS Y USO:

El uso es simple. Incluya la primera función para publicar en la consola manualmente. Use la segunda función para desviar el manejo de excepciones de php. La siguiente prueba debería dar una idea.

    // Test 1 - Auto - Handle php error and report error with severity info
    $a[1] = 'jfksjfks';
    try {
          $b = $a[0];
    } catch (Exception $e) {
          echo "jsdlkjflsjfkjl";
    }

    // Test 2 - Manual - Without explicitly providing file name and line no.
          console(array(1 => "Hi", array("hellow")), false);

    // Test 3 - Manual - Explicitly providing file name and line no.
          console(array(1 => "Error", array($some_result)), true, 'my file', 2);

    // Test 4 - Manual - Explicitly providing file name only.
          console(array(1 => "Error", array($some_result)), true, 'my file');

EXPLICACIÓN

  • La función console($data, $is_error, $file, $fn)toma una cadena o matriz como primer argumento y la publica en la consola usando inserciones js.

  • El segundo argumento es una bandera para diferenciar los registros normales de los errores. Para errores, estamos agregando oyentes de eventos para informarnos a través de alertas si se arrojaron errores, también resaltando en la consola. Esta bandera está predeterminada en falso.

  • Los argumentos tercero y cuarto son declaraciones explícitas de archivos y números de línea, que es opcional. Si está ausente, están predeterminados para usar la función predefinida de php debug_backtrace()para buscarlos para nosotros.

  • La siguiente función exceptions_to_console($svr, $str, $file, $ln)tiene cuatro argumentos en el orden invocado por el controlador de excepciones predeterminado de php. Aquí, el primer argumento es la gravedad, que verificamos con constantes predefinidas utilizando la función severity_tag($code)para proporcionar más información sobre el error.

AVISO :

  • El código anterior utiliza funciones y métodos JS que no están disponibles en navegadores antiguos. Para compatibilidad con versiones anteriores, necesita reemplazos.

  • El código anterior es para probar entornos, donde solo usted tiene acceso al sitio. No use esto en sitios web en vivo (producción).

SUGERENCIAS

  • La primera función console()arrojó algunos avisos, así que los incluí dentro de otra función y la llamé usando el operador de control de errores '@'. Esto se puede evitar si no le importaron los avisos.

  • Por último, pero no menos importante, las alertas emergentes pueden ser molestas durante la codificación. Para esto estoy usando este pitido (que se encuentra en la solución: https://stackoverflow.com/a/23395136/6060602 ) en lugar de alertas emergentes. Es genial y las posibilidades son infinitas, puedes tocar tus canciones favoritas y hacer que la codificación sea menos estresante.

Ajay Singh
fuente