Konsola bir dize veya günlük yazmak mümkün mü?
Demek istedigim
Tıpkı JSP'de olduğu gibi system.out.println("some")
, böyle bir şey yazdırırsak , bir sayfada değil, konsolda olacaktır.
Konsola bir dize veya günlük yazmak mümkün mü?
Tıpkı JSP'de olduğu gibi system.out.println("some")
, böyle bir şey yazdırırsak , bir sayfada değil, konsolda olacaktır.
Yanıtlar:
Firefox
Firefox'ta PHP uygulamalarınızdan konsola bilgilerin kaydedilmesini ve dökülmesini sağlayan FirePHP adlı bir uzantı kullanabilirsiniz . Bu harika web geliştirme uzantısı Firebug bir eklenti .
Krom
Ancak Chrome kullanıyorsanız Chrome Logger veya webug adlı bir PHP hata ayıklama aracı vardır (webug günlüklerin sırası ile ilgili sorunlara sahiptir).
Daha yakın zamanda Clockwork , yararlı hata ayıklama ve profil oluşturma bilgileri sağlamak için yeni bir panel ekleyerek Geliştirici Araçlarını genişleten aktif bir geliştirme sürecindedir. Laravel 4 ve Slim 2 için kutudan çıkar çıkmaz destek sağlar ve genişletilebilir API'si ile destek eklenebilir.
Xdebug kullanma
PHP hata ayıklamak için daha iyi bir yol Xdebug aracılığıyla olacaktır . Çoğu tarayıcı, hata ayıklama işlemini başlatmak için gerekli çerez / sorgu dizesini geçmenize yardımcı olacak yardımcı uzantılar sağlar.
Veya PHP hata ayıklama hile konsol için kullanın .
Önce küçük bir PHP yardımcı fonksiyonuna ihtiyacınız var
function debug_to_console($data) {
$output = $data;
if (is_array($output))
$output = implode(',', $output);
echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
O zaman bu şekilde kullanabilirsiniz:
debug_to_console("Test");
Bu, şöyle bir çıktı oluşturur:
Debug Objects: Test
"Debug Objects: " . $data . ""
$data
görünürse, işlevi tam olarak gösterildiği gibi yazmadınız . Yukarıdaki kodla eşleştiğinden emin olmak için tek ve çift tırnaklarınıza dikkatlice bakın. $data
bir php değişkenidir; sayfa tarayıcıya gönderildiğinde, bu php değişkeni yerine geçirilen parametre ile değiştirilir debug_to_console
. Tarayıcı asla görmemelidir $data
. ( page source
Tarayıcıya bakarsanız, söylememelisiniz $data
.)
Basit bir yaklaşım arıyorsanız, JSON olarak yankılanın:
<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>"; }
Varsayılan olarak, stdout
komut dosyanızın Apache tarafından mı yoksa komut satırında el ile mi çalıştırıldığına bağlı olarak tüm çıktılar HTTP yanıtı veya konsol olana gider . Ancak error_log
günlüğe kaydetme için kullanabilirsiniz ve çeşitli G / Ç akışları ile yazılabilir fwrite
.
Takip etmeyi dene. Çalışıyor:
echo("<script>console.log('PHP: " . $data . "');</script>");
echo
"<div display='none'>
<script type='text/javascript'>
console.log('console log message');
</script>
</div>";
Oluşturur
<div>
ile
display="none"
böylece div görüntülenmez, ancak
console.log()
işlevi javascript'te oluşturulur. Böylece mesajı konsoldan alırsınız.
div
. sadece bir <script>
bloğunuz varsa , tarayıcıda hiçbir şey görüntülenmez.
json.encode
kod satırınızı kırmaması için iletiyi bir çağrıya sarmanız iyi olur . Örneğin:echo "<script>console.log(".json_encode($msg).")</script>";
Popüler yanıtta bağlantılı web sayfasının yazarı olarak, bu basit yardımcı işlevinin son sürümünü eklemek istiyorum. Çok daha sağlam.
Kullandığım json_encode()
değişken türü değil gerekirse bir çek yapmak ve aynı zamanda çerçeveler ile ilgili sorunları çözmek için bir tampon eklemek için. Katı bir geri dönüşü veya aşırı kullanımı yoktur 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);`
Ayrıca daha kolay anlamak için bir görüntü olarak basit bir örnek:
Bence kullanılabilir -
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"]}
Daha fazla derinlik katan bazı harika cevaplar; ancak JavaScript console.log()
komutuna benzer daha basit ve daha fazlasına ihtiyacım vardı .
Ben Ajax uygulamalarda "veri toplama ve XML dönüştürmek" bir sürü PHP kullanın. JavaScript console.log
bu durumda çalışmaz; XML çıktısını keser.
Xdebug, vb. Benzer sorunları vardı.
Windows'taki çözümüm:
.txt
Kolayca ulaşılabilen ve yazılabilir bir dosya oluşturunerror_log
değişkenini bu .ini
dosyaya yazacak şekilde ayarlamaerror_log('myTest');
İleti göndermek için PHP komutunu kullanmaBu çözüm basittir ve çoğu zaman ihtiyaçlarımı karşılar. Standart PHP ve önizleme bölmesi PHP her yazdığında otomatik olarak güncellenir.
json_encode
da sorunu çözer mi? Öyleyse, iletideki tırnak işaretleri komut dosyasındaki tırnak işaretleriyle çakışabilir. (örneğin:) echo "<script>console.log(".json_encode($msg).")</script>";
. Değilse, console.log komut dosyasının bozulmasına neden olan sorunun ne olduğunu ve çözümünüzün bunu nasıl / neden düzelttiğini merak ediyorum. Çözümünüz iyi - Ben sadece neden console.log
veya xml çıktı kırılmasına neden olan koşullar hakkında daha fazla bilgi edinmek çalışıyorum . Çoğu durumda, yaptığınız gibi bir hata günlüğü hızlı bir işlemden çok daha iyidir console.log
.
$variable = "Variable";
echo "<script>console.log('$variable');</script>";
PHP ve JavaScript etkileşimi.
Bunu faydalı buluyorum:
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;
}
}
Ve şöyle kullanın:
<?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);
?>
Konsolda hangi çıkışlar:
Important Less Important Even Less Important Again Important
Ve daha az önemli günlükleri $ debug değerini kullanarak sınırlandırarak kapatabilirsiniz.
console('Even Less Important' ,6 , $debug);
bu ararsanız konsolda görüntülenmez? neden öyle? 5 üzerinde hiçbir şey görüntülenmez
$output = '<script>console.log("' . str_repeat(" ", $priority-1)
ve . '");</script>';
. Sadece implode(",", $data)
ve $data
farklı.
Kısa ve kolay, diziler, dizeler veya nesneler için.
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
}
JavaScript konsoluna değil, PHP günlük dosyasına yazmak istiyorsanız bunu kullanabilirsiniz:
error_log("This is logged only to the PHP log")
Referans: error_log
Chrome için PHP günlüklerini kaydetmeye izin veren Chrome Logger adlı bir uzantı var .
Firefox DevTools , Chrome Logger protokolü için entegre desteğe bile sahiptir .
Günlüğe kaydetmeyi etkinleştirmek için 'ChromePhp.php' dosyasını projenize kaydetmeniz yeterlidir . Sonra şu şekilde kullanılabilir:
include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');
GitHub sayfasından alınan örnek .
Çıktı daha sonra şöyle görünebilir:
"ccampbell/chromephp": "*"
Ayrıca aşağıdakileri yapmanızı sağlayan bir PHP kütüphanesine sahip harika bir Google Chrome uzantısı olan PHP Konsolu da vardır:
error file:line
Metin düzenleyicinize atlayın .Geliştirdiğim ve bu yazıyla karşılaştığım bir WordPress eklentisinde kodda hata ayıklamanın bir yolunu arıyordum.
Diğer yanıtlardan benim için en uygun olan kod parçalarını aldım ve bunları WordPress hata ayıklaması için kullanabileceğim bir işleve birleştirdim. İşlev:
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>";
}
Kullanımı aşağıdaki gibidir:
$txt = 'This is a test string';
$sample_array = array('cat', 'dog', 'pig', 'ant', 'fly');
debug_log($txt, '', 7);
debug_log($sample_array);
Bu işlev WordPress geliştirmesiyle birlikte kullanılırsa, işlev functions.php
alt temanın dosyasına yerleştirilmeli ve kodun herhangi bir yerine çağrılabilir.
Yukarıdakilerin hepsini Debugger & Logger lehine terk ettim . Yeterince övemem!
Sağ üstteki sekmelerden birini veya genişletmek / gizlemek için "burayı tıklayın" ı tıklamanız yeterlidir.
Farklı "kategorilere" dikkat edin. Genişletmek / daraltmak için herhangi bir diziyi tıklatabilirsiniz.
Web sayfasından
Ana Özellikler:
- Global değişkenleri göster ($ GLOBALS, $ _POST, $ _GET, $ _COOKIE vb.)
- PHP sürümünü ve yüklü uzantıları göster
- Yerleşik PHP hata işleyicisini değiştirin
- SQL sorgularını günlüğe kaydet
- Kod ve SQL sorgularının yürütme süresini izleyin
- Değişkenleri değişikliklere karşı inceleyin
- İşlev çağrıları izleme
- Hangi kod satırlarının yürütüldüğünü kontrol etmek için kod kapsamı analizi
- Tüm değişken türlerinin dökümü
- Kaynak kodunu görüntülemek için kod vurgulayıcılı dosya denetçisi
- Ajax komut dosyaları için JavaScript konsoluna mesaj gönderme (yalnızca Chrome)
2017 itibariyle Firebug ve dolayısıyla FirePHP devre dışı bırakıldı .
Konsol aracılığıyla hata ayıklamak için FirePHP'den Firebug'a sorunsuz geçişe izin vermek için ChromePHP aracında bazı küçük değişiklikler yazdım.
Bu makalede açık ve kolay adımlar anlatılmaktadır
FirePHP'den ChromePHP'ye 5 dakika içinde geçin (mevcut kodu bozmadan)
Gövdeyle uğraşmak istemediğiniz Ajax çağrıları veya XML / JSON yanıtları için, günlükleri HTTP üstbilgileri aracılığıyla göndermeniz ve ardından bunları web uzantısıyla konsola eklemeniz gerekir. Firefox'ta FirePHP (artık mevcut değil) ve QuantumPHP (bir ChromePHP çatalı) bunu yapıyor.
Sabrınız varsa, x-debug daha iyi bir seçenektir - betiğinizi duraklatma, neler olup bittiğini görme ve betiği devam ettirme yeteneği ile PHP hakkında daha derin bir fikir edinirsiniz.
Bir partiye geç kalabilirim, ancak günlükleme işlevinin uygulanmasını arıyordum:
console.log()
,console.log()
.Böylece çıktı şöyle görünür:
(Aşağıdaki snippet php üzerinde test edilmiştir 7.2.11
. Onun php geriye dönük uyumluluğundan emin değilim. Bu console.log()
argümanlar sonra bir virgül oluşturur - çünkü, javascript için de bir sorun olabilir (eski tarayıcıların bir terim) kadar yasal 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);
?>
İşte benim çözümüm, bununla ilgili iyi olan şey, istediğiniz kadar param geçirebilmeniz.
function console_log()
{
$js_code = 'console.log(' . json_encode(func_get_args(), JSON_HEX_TAG) .
');';
$js_code = '<script>' . $js_code . '</script>';
echo $js_code;
}
Bu şekilde ara
console_log('DEBUG>>', 'Param 1', 'Param 2');
console_log('Console DEBUG:', $someRealVar1, $someVar, $someArray, $someObj);
Artık konsolunuzdaki çıktıyı görebilmelisiniz, mutlu kodlama :)
kullanın:
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));
}
İşte kullanışlı bir işlev. Kullanımı son derece basittir, istediğiniz türde ve istediğiniz sayıda argüman iletmenize olanak tanır ve nesne içeriğini tarayıcı konsolu penceresinde JavaScript'ten - ama PHP'den çağırdığınız gibi görüntüleyecektir.
Etiketleri, 'TAG-YourTag' ileterek de kullanabilirsiniz; etiket başka bir etiket okunana kadar uygulanacaktır, örneğin, '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>";
}
}
}
}
NOT: func_num_args () ve func_num_args () , dinamik sayıda giriş bağımsız değişkenini okumak için kullanılan PHP işlevleridir ve bu işlevin bir işlev çağrısından sonsuz sayıda console.log isteğine sahip olmasını sağlar.
Bu eski bir soru olmasına rağmen, bunu arıyordum. Burada yanıtlanan bazı çözümleri ve başka bir yerde herkese uyan tek bir çözümü elde etmek için bulduğum bazı fikirleri derlemem.
KOD:
// 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');
TESTLER VE KULLANIM:
Kullanımı basit. Konsola manuel olarak göndermek için ilk işlevi dahil edin. Php kural dışı durum işleme yönlendirme için ikinci işlevi kullanın. Aşağıdaki test bir fikir vermelidir.
// 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');
AÇIKLAMA:
İşlev console($data, $is_error, $file, $fn)
, dize veya diziyi ilk bağımsız değişken olarak alır ve js eklerini kullanarak konsola gönderir.
İkinci argüman, normal günlükleri hatalara göre ayıran bir işarettir. Hatalar için, herhangi bir hata atıldığında bizi uyarılar aracılığıyla bilgilendirmek için olay dinleyicileri ekliyoruz, ayrıca konsolda da vurgulanıyor. Bu bayrak varsayılan olarak false değerine ayarlanmıştır.
Üçüncü ve dördüncü argümanlar, isteğe bağlı olan dosya ve satır numaralarının açık beyanlarıdır. Eğer yoksa, debug_backtrace()
onları bizim için getirmek için önceden tanımlanmış php işlevini kullanacak şekilde varsayılan olarak kullanılırlar .
Sonraki işlevin exceptions_to_console($svr, $str, $file, $ln)
php varsayılan özel durum işleyicisi tarafından çağrılan sırada dört bağımsız değişkeni vardır. Burada, ilk argüman, severity_tag($code)
hata hakkında daha fazla bilgi sağlamak için işlevi kullanarak önceden tanımlanmış sabitlerle daha fazla kontrol ettiğimiz ciddiyettir .
FARKINA VARMAK :
Yukarıdaki kod, eski tarayıcılarda bulunmayan JS işlevlerini ve yöntemlerini kullanır. Eski sürümlerle uyumluluk için değiştirilmesi gerekir.
Yukarıdaki kod, yalnızca siteye erişiminizin olduğu ortamları test etmek içindir. Bunu canlı (prodüksiyon) web sitelerinde kullanmayın.
ÖNERİLER :
İlk fonksiyon console()
bazı bildirimler attı, bu yüzden onları başka bir fonksiyona sardım ve hata kontrol operatörü '@' kullanarak çağırdım. Bildirimleri dikkate almadıysanız bu önlenebilir.
Son fakat aynı derecede önemli olarak, uyarılar açılırken kodlama sırasında can sıkıcı olabilir. Bunun için pop-up uyarıları yerine bu bip sesini kullanıyorum (çözümde bulundu: https://stackoverflow.com/a/23395136/6060602 ). Oldukça havalı ve olasılıklar sonsuz, en sevdiğiniz şarkıları çalabilir ve kodlamayı daha az stresli hale getirebilirsiniz.