Có thể viết một chuỗi hoặc đăng nhập vào giao diện điều khiển?
Ý tôi là
Giống như trong JSP, nếu chúng ta in một cái gì đó giống như system.out.println("some")
, nó sẽ ở đó trên bàn điều khiển, không phải ở một trang.
Có thể viết một chuỗi hoặc đăng nhập vào giao diện điều khiển?
Giống như trong JSP, nếu chúng ta in một cái gì đó giống như system.out.println("some")
, nó sẽ ở đó trên bàn điều khiển, không phải ở một trang.
Câu trả lời:
Firefox
Trên Firefox, bạn có thể sử dụng một tiện ích mở rộng có tên FirePHP cho phép ghi nhật ký và chuyển thông tin từ các ứng dụng PHP của bạn sang bàn điều khiển. Đây là một tiện ích bổ sung cho phần mở rộng phát triển web tuyệt vời Fireorms .
Trình duyệt Chrome
Tuy nhiên, nếu bạn đang sử dụng Chrome, có một công cụ gỡ lỗi PHP có tên là Chrome Logger hoặc webug (webug có vấn đề với thứ tự nhật ký).
Gần đây, Clockwork đang trong giai đoạn phát triển tích cực, mở rộng Công cụ dành cho nhà phát triển bằng cách thêm bảng điều khiển mới để cung cấp thông tin gỡ lỗi và lược tả hữu ích. Nó cung cấp hỗ trợ ngoài hộp cho Laravel 4 và Slim 2 và có thể thêm hỗ trợ thông qua API mở rộng của nó.
Sử dụng Xdebug
Một cách tốt hơn để gỡ lỗi PHP của bạn sẽ thông qua Xdebug . Hầu hết các trình duyệt cung cấp tiện ích mở rộng trợ giúp để giúp bạn vượt qua chuỗi cookie / truy vấn cần thiết để khởi tạo quy trình gỡ lỗi.
Hoặc bạn sử dụng thủ thuật từ PHP Debug đến console .
Trước tiên, bạn cần một hàm trợ giúp PHP nhỏ
function debug_to_console($data) {
$output = $data;
if (is_array($output))
$output = implode(',', $output);
echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
Sau đó, bạn có thể sử dụng nó như thế này:
debug_to_console("Test");
Điều này sẽ tạo ra một đầu ra như thế này:
Debug Objects: Test
"Debug Objects: " . $data . ""
$data
xuất hiện trong đầu ra, thì bạn đã không gõ chính xác chức năng như được hiển thị. Hãy xem xét kỹ các trích dẫn đơn và kép của bạn để đảm bảo chúng khớp với mã ở trên. $data
là một biến php; tại thời điểm trang được gửi tới trình duyệt, biến php đó sẽ được thay thế bằng tham số được truyền tới debug_to_console
. Trình duyệt không bao giờ nên xem $data
. (Nếu bạn nhìn vào page source
trình duyệt thì không nên nói $data
.)
Nếu bạn đang tìm kiếm một cách tiếp cận đơn giản, hãy lặp lại dưới dạng JSON:
<script>
console.log(<?= json_encode($foo); ?>);
</script>
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>"; }
Theo mặc định, tất cả đầu ra đi tới stdout
, đó là phản hồi HTTP hoặc bàn điều khiển, tùy thuộc vào việc tập lệnh của bạn được chạy bởi Apache hay bằng tay trên dòng lệnh. Nhưng bạn có thể sử dụng error_log
để ghi nhật ký và các luồng I / O khác nhau có thể được ghi vào fwrite
.
error_log
là những gì tôi cần để xuất ra thiết bị đầu cuối từ máy chủ web tích hợp PHP
Hãy thử như sau. Nó đang làm việc:
echo("<script>console.log('PHP: " . $data . "');</script>");
echo
"<div display='none'>
<script type='text/javascript'>
console.log('console log message');
</script>
</div>";
Tạo ra một
<div>
với
display="none"
để div không được hiển thị, nhưng
console.log()
chức năng được tạo trong javascript. Vì vậy, bạn nhận được thông báo trong giao diện điều khiển.
div
. nếu bạn chỉ có một <script>
khối, sẽ không có gì được hiển thị trong trình duyệt.
json.encode
dấu ngoặc kép không phá vỡ dòng mã của bạn. Ví dụ:echo "<script>console.log(".json_encode($msg).")</script>";
Là tác giả của trang web được liên kết trong câu trả lời phổ biến , tôi muốn thêm phiên bản cuối cùng của chức năng trợ giúp đơn giản này. Nó vững chắc hơn nhiều.
Tôi sử dụng json_encode()
để thực hiện kiểm tra nếu loại biến không cần thiết và cũng thêm một bộ đệm để giải quyết các vấn đề với khung. Không có một sự trở lại vững chắc hoặc sử dụng quá mức 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;
}
// $data is the example variable, object; here an array.
$data = [ 'foo' => 'bar' ];
debug_to_console($data);`
Cũng là một ví dụ đơn giản như một hình ảnh để hiểu nó dễ dàng hơn nhiều:
Tôi nghĩ rằng nó có thể được sử dụng -
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"]}
Một số câu trả lời tuyệt vời mà thêm chiều sâu; nhưng tôi cần một cái gì đó đơn giản hơn và giống console.log()
lệnh JavaScript hơn .
Tôi sử dụng PHP trong rất nhiều "thu thập dữ liệu và biến thành XML" trong các ứng dụng Ajax. JavaScript console.log
không hoạt động trong trường hợp đó; nó phá vỡ đầu ra XML.
Xdebug, vv có vấn đề tương tự.
Giải pháp của tôi trong Windows:
.txt
tệp có thể dễ dàng truy cập và ghi đượcerror_log
biến PHP trong .ini
tệp để ghi vào tệp đóerror_log('myTest');
lệnh PHP để gửi tin nhắnGiải pháp này là đơn giản và đáp ứng nhu cầu của tôi hầu hết thời gian. PHP chuẩn và khung xem trước tự động cập nhật mỗi khi PHP ghi vào nó.
json_encode
cũng giải quyết vấn đề? Nếu vậy, có thể là dấu ngoặc kép trong thông điệp đã can thiệp vào dấu ngoặc kép trong tập lệnh. (ví dụ echo "<script>console.log(".json_encode($msg).")</script>";
:). Nếu không, tôi tò mò vấn đề gì đã khiến tập lệnh console.log bị hỏng và làm thế nào / tại sao giải pháp của bạn khắc phục điều đó. Giải pháp của bạn rất tốt - Tôi chỉ đang cố gắng tìm hiểu thêm về các điều kiện gây ra console.log
hoặc đầu ra xml bị phá vỡ. Trong nhiều trường hợp, một bản ghi lỗi như bạn đã làm tốt hơn nhiều so với nhanh chóng console.log
.
$variable = "Variable";
echo "<script>console.log('$variable');</script>";
Tương tác PHP và JavaScript.
Tôi thấy điều này hữu ích:
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;
}
}
Và sử dụng nó như:
<?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);
?>
Đầu ra nào trong giao diện điều khiển:
Important Less Important Even Less Important Again Important
Và bạn có thể tắt các nhật ký ít quan trọng hơn bằng cách giới hạn chúng bằng cách sử dụng giá trị gỡ lỗi $.
console('Even Less Important' ,6 , $debug);
điều này sẽ không được hiển thị trong giao diện điều khiển? tại sao vậy? là bất cứ thứ gì trên 5 không được hiển thị
$output = '<script>console.log("' . str_repeat(" ", $priority-1)
và . '");</script>';
. Chỉ implode(",", $data)
và $data
là khác nhau.
Ngắn và dễ dàng, cho các mảng, chuỗi hoặc cả các đối tượng.
function console_log( $data ) {
$output = "<script>console.log( 'PHP debugger: ";
$output .= json_encode(print_r($data, true));
$output .= "' );</script>";
echo $output;
}
function phpconsole($label='var', $x) {
?>
<script type="text/javascript">
console.log('<?php echo ($label)?>');
console.log('<?php echo json_encode($x)?>');
</script>
<?php
}
Nếu bạn muốn ghi vào tệp nhật ký PHP và không phải bảng điều khiển JavaScript, bạn có thể sử dụng tệp này:
error_log("This is logged only to the PHP log")
Tham khảo: error_log
Đối với Chrome, có một tiện ích mở rộng có tên Chrome Logger cho phép ghi nhật ký các thông điệp PHP.
Firefox DevTools thậm chí còn hỗ trợ tích hợp cho giao thức Chrome Logger .
Để cho phép ghi nhật ký, bạn chỉ cần lưu tệp 'ChromePhp.php' trong dự án của bạn. Sau đó, nó có thể được sử dụng như thế này:
include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');
Ví dụ lấy từ trang GitHub .
Đầu ra có thể trông như thế này:
"ccampbell/chromephp": "*"
Ngoài ra còn có một tiện ích mở rộng tuyệt vời của Google Chrome, Bảng điều khiển PHP , với thư viện PHP cho phép bạn:
error file:line
trong trình soạn thảo văn bản của bạn.Tôi đang tìm cách gỡ lỗi mã trong một plugin WordPress mà tôi đang phát triển và tình cờ thấy bài đăng này.
Tôi đã lấy các đoạn mã có thể áp dụng nhất cho tôi từ các phản hồi khác và kết hợp chúng thành một chức năng mà tôi có thể sử dụng để gỡ lỗi WordPress. Chức năng là:
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>";
}
Cách sử dụng như sau:
$txt = 'This is a test string';
$sample_array = array('cat', 'dog', 'pig', 'ant', 'fly');
debug_log($txt, '', 7);
debug_log($sample_array);
Nếu chức năng này được sử dụng với sự phát triển của WordPress, thì chức năng này phải được đặt trong functions.php
tệp của chủ đề con và sau đó có thể được gọi ở bất kỳ đâu trong mã.
Tôi đã từ bỏ tất cả những điều trên để ủng hộ Debugger & Logger . Tôi không thể khen ngợi nó đủ!
Chỉ cần nhấp vào một trong các tab ở trên cùng bên phải hoặc vào "nhấp vào đây" để mở rộng / ẩn.
Lưu ý các "danh mục" khác nhau. Bạn có thể nhấp vào bất kỳ mảng nào để mở rộng / thu gọn nó.
Từ trang web
Những đặc điểm chính:
- Hiển thị các biến toàn cục ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE, v.v.)
- Hiển thị phiên bản PHP và các phần mở rộng được tải
- Thay thế PHP được xây dựng trong trình xử lý lỗi
- Đăng nhập truy vấn SQL
- Theo dõi mã thời gian và mã truy vấn SQL
- Kiểm tra các biến để thay đổi
- Chức năng gọi theo dõi
- Phân tích phạm vi bảo hiểm để kiểm tra dòng kịch bản nào được thực thi
- Kết xuất của tất cả các loại biến
- Trình kiểm tra tệp với mã tô sáng để xem mã nguồn
- Gửi tin nhắn đến bảng điều khiển JavaScript (chỉ dành cho Chrome), cho các tập lệnh Ajax
Kể từ năm 2017, Fireorms và do đó FirePHP đã bị vô hiệu hóa .
Tôi đã viết một số sửa đổi nhỏ cho công cụ ChromePHP để cho phép di chuyển liền mạch từ FirePHP sang Fireorms để gỡ lỗi thông qua bảng điều khiển.
Bài viết này giải thích trong các bước dễ dàng rõ ràng
Di chuyển từ FirePHP sang ChromePHP trong 5 phút (không vi phạm mã hiện có)
Đối với các cuộc gọi Ajax hoặc các phản hồi XML / JSON, nơi bạn không muốn gây rối với phần thân, bạn cần gửi nhật ký qua các tiêu đề HTTP, sau đó thêm chúng vào bảng điều khiển với tiện ích mở rộng web. Đây là cách FirePHP (không còn khả dụng) và QuantumPHP (một nhánh của ChromePHP) làm điều đó trong Firefox.
Nếu bạn có kiên nhẫn, x-debug là một lựa chọn tốt hơn - bạn hiểu sâu hơn về PHP, với khả năng tạm dừng tập lệnh của bạn, xem điều gì đang xảy ra, sau đó tiếp tục tập lệnh.
Tôi có thể bị trễ một bữa tiệc, nhưng tôi đang tìm kiếm một triển khai chức năng ghi nhật ký:
console.log()
,console.log()
.Vì vậy, đầu ra trông như thế:
(Đoạn mã dưới đây đã được thử nghiệm trên php 7.2.11
. Tôi không chắc về khả năng tương thích ngược php của nó. Nó cũng có thể là một vấn đề đối với javascript (theo thuật ngữ của các trình duyệt cũ), vì nó tạo ra dấu phẩy sau các console.log()
đối số - không phải là dấu phẩy hợp pháp cho đến khi 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);
?>
Đây là giải pháp của tôi, điều tốt về cái này là bạn có thể vượt qua bao nhiêu thông số tùy thích.
function console_log()
{
$js_code = 'console.log(' . json_encode(func_get_args(), JSON_HEX_TAG) .
');';
$js_code = '<script>' . $js_code . '</script>';
echo $js_code;
}
Gọi nó theo cách này
console_log('DEBUG>>', 'Param 1', 'Param 2');
console_log('Console DEBUG:', $someRealVar1, $someVar, $someArray, $someObj);
Bây giờ bạn sẽ có thể thấy đầu ra trong bảng điều khiển của mình, mã hóa vui vẻ :)
Sử dụng:
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));
}
Đây là một chức năng tiện dụng. Nó rất đơn giản để sử dụng, cho phép bạn chuyển bao nhiêu đối số tùy thích, dưới mọi hình thức và sẽ hiển thị nội dung đối tượng trong cửa sổ bảng điều khiển trình duyệt như thể bạn gọi là console.log từ JavaScript - nhưng từ PHP
Lưu ý, bạn cũng có thể sử dụng các thẻ bằng cách chuyển 'TAG-YourTag' và nó sẽ được áp dụng cho đến khi một thẻ khác được đọc, ví dụ: '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>";
}
}
}
}
LƯU Ý: func_num_args () và func_num_args () là các hàm PHP để đọc số lượng đối số đầu vào động và cho phép hàm này có vô số yêu cầu console.log từ một lệnh gọi hàm.
Mặc dù đây là một câu hỏi cũ, tôi đã tìm kiếm nó. Dưới đây là tổng hợp của tôi về một số giải pháp đã được trả lời ở đây và một số ý tưởng khác được tìm thấy ở nơi khác để có được giải pháp một kích cỡ phù hợp cho tất cả.
MÃ:
// 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');
KIỂM TRA & SỬ DỤNG:
Cách sử dụng rất đơn giản. Bao gồm chức năng đầu tiên để đăng lên bàn điều khiển bằng tay. Sử dụng chức năng thứ hai để chuyển hướng xử lý ngoại lệ php. Kiểm tra sau nên đưa ra một ý tưởng.
// 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');
GIẢI TRÌNH :
Hàm console($data, $is_error, $file, $fn)
lấy chuỗi hoặc mảng làm đối số đầu tiên và đăng nó lên bàn điều khiển bằng cách sử dụng js chèn.
Đối số thứ hai là một cờ để phân biệt các bản ghi bình thường chống lại lỗi. Đối với các lỗi, chúng tôi đang thêm các trình lắng nghe sự kiện để thông báo cho chúng tôi thông qua các cảnh báo nếu có bất kỳ lỗi nào được đưa ra, cũng nhấn mạnh trong bảng điều khiển. Cờ này được mặc định là sai.
Đối số thứ ba và thứ tư là khai báo rõ ràng về số tệp và số dòng, là tùy chọn. Nếu vắng mặt, họ được mặc định sử dụng hàm php được xác định trước debug_backtrace()
để tìm nạp chúng cho chúng tôi.
Hàm tiếp theo exceptions_to_console($svr, $str, $file, $ln)
có bốn đối số theo thứ tự được gọi bởi trình xử lý ngoại lệ mặc định của php. Ở đây, đối số đầu tiên là mức độ nghiêm trọng, chúng tôi tiếp tục kiểm tra chéo với các hằng số được xác định trước bằng cách sử dụng hàm severity_tag($code)
để cung cấp thêm thông tin về lỗi.
ĐỂ Ý :
Mã trên sử dụng các hàm và phương thức JS không có sẵn trong các trình duyệt cũ hơn. Để tương thích với các phiên bản cũ hơn, nó cần thay thế.
Mã trên dành cho các môi trường thử nghiệm, nơi bạn một mình có quyền truy cập vào trang web. Không sử dụng điều này trong các trang web (sản xuất) trực tiếp.
BỀN VỮNG:
Hàm đầu tiên console()
đã đưa ra một số thông báo, vì vậy tôi đã bọc chúng trong một hàm khác và gọi nó bằng toán tử kiểm soát lỗi '@'. Điều này có thể tránh được nếu bạn không bận tâm đến các thông báo.
Cuối cùng nhưng không kém phần quan trọng, các cảnh báo bật lên có thể gây khó chịu trong khi mã hóa. Đối với điều này, tôi đang sử dụng tiếng bíp này (tìm thấy trong giải pháp: https://stackoverflow.com/a/23395136/6060602 ) thay vì cảnh báo bật lên. Nó khá tuyệt và khả năng là vô tận, bạn có thể chơi những giai điệu yêu thích và làm cho việc viết mã bớt căng thẳng hơn.