※当サイトの記事には、広告・プロモーションが含まれます。

Chrome Loggerは、echoなどの後で使うとエラーになる?(PHPで使う場合)

どうも、最近、Chrome Loggerという存在を知りました、時代の波に取り残されまくってます。ハマってる音楽は、Of Monsters And Men です、最近は聞けてないけど。

Chrome Loggerとは

何でも、Chromeブラウザの拡張機能らしいです。オンリーChrome?Yes, We Can!

というわけで、残念ながらChrome以外では使えません。 

Chrome Logger - Server side application debugging によりますと、

結構な数のサーバーサイド言語で使えるようです。

PHPで試してみました

PHPでの導入の仕方については下記サイトを参考にさせていただきました。

PHPからChromeにログ出力「Chrome Logger」 : アシアルブログ

Chrome Loggerを使ってPHPのデバッグをコンソール画面から確認してみる。 - Qiita

PHP開発時におけるデバッグ/プロファイリングの手段・ツール3+2選 | 東北ギーク

 

今回こんな感じのフォルダ構成(C:¥xampp¥htdocs¥test)

f:id:ts0818:20170523212751j:plain

php_moduleフォルダを作って、

https://github.com/ccampbell/chromephp のフォルダをダウンロードしてきて配置してます。(ChromePhp.phpファイルだけあれば良いみたいです)

f:id:ts0818:20170523220558j:plain

で、ブラウザ側でChrome Loggerという拡張機能を入れます。

Chrome Logger - Chrome ウェブストア - Google

f:id:ts0818:20170523221310j:plain

拡張機能が追加出来たら、Chrome Loggerを使いたいページでChrome Loggerのアイコンをクリックします。青くなったらOK。  

無効

f:id:ts0818:20170523222836j:plain

有効

f:id:ts0818:20170523222121j:plain

 

で、使ってみたのですが、 

ただ、echo文の後に記述するとエラーが出てしまうという謎現象が起こってます。 

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>登録店舗チェック</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>

<?php 
// パスの区切り文字の補完
$DS = DIRECTORY_SEPARATOR;
// phpをconsoleに表示してくれるdebbugツールChrome Logger(Chrome限定のようです)
require_once(dirname(__FILE__). $DS.'php_module'. $DS .'chromephp-master'. $DS .'ChromePhp.php');
// 残すべき店舗一覧
$array_shops_list = array();

// 依頼主からの店舗情報(最終的に登録したい店舗)
$file = dirname(__FILE__). '/shop.txt';
// 配列に格納
$array_kanon_shop = @file($file, FILE_IGNORE_NEW_LINES);

// いま、管理画面側で登録されてしまっている店舗一覧
$dom = new DOMDocument('1.0', 'UTF-8');
$dom-&amp;gt;preserveWhiteSpace = false;
$dom-&amp;gt;formatOutput = true;

// 本番環境とテスト環境を判定
$S_AD = $_SERVER['SERVER_ADDR'];
$R_AD = $_SERVER['REMOTE_ADDR'];
// 本番環境
if(substr($S_AD,0,mb_strrpos($S_AD,'.')) != substr($R_AD,0,mb_strrpos($R_AD,'.'))){
  $dom-&amp;gt;load(dirname(__FILE__)."/production/wordpress.2017-05-22.xml");
  ChromePhp::log("本番環境");
} else {
  // ローカル環境
  $dom-&amp;gt;load(dirname(__FILE__)."/testing/wordpress.2017-05-22.xml");
  ChromePhp::log("テスト環境");
}

$xpath = new DOMXPath($dom);

// wordpress.2017-05-22.xmlのtitleの部分のみ取得
$result = $xpath-&amp;gt;query('//channel/item/title');

// 店舗リスト出力用ファイル
$shop_regist_list_file = 'shop_regist_list_file.txt';
$shop_delete_list_file = 'shop_delete_list_file.txt';

// 登録すべき店舗
$shop_regist_list_string = '';
// 削除すべき店舗
$shop_delete_list_string = '';

// 繰り返し処理で残すべき店舗を検索
foreach($result as $node){
  // 登録すべき店舗
  if(in_array($node-&amp;gt;nodeValue, $array_kanon_shop, true)){
    $shop_regist_list_string .= $node-&amp;gt;nodeValue. PHP_EOL;
    echo '&amp;lt;div class="register"&amp;gt;&amp;lt;span&amp;gt;' . $node-&amp;gt;nodeValue . "&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;";
  } else {
    // 削除すべき店舗
    $shop_delete_list_string .= $node-&amp;gt;nodeValue. PHP_EOL;
    echo '&amp;lt;div class="delete"&amp;gt;&amp;lt;span&amp;gt;' . $node-&amp;gt;nodeValue . "&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;";
  }
  // ChromePhp::log($node); ← コメントアウトを外すとエラー
}

// ファイルに出力
file_put_contents($shop_regist_list_file, $shop_regist_list_string);
file_put_contents($shop_delete_list_file, $shop_delete_list_string);

?>

</body>
</html>

Chromeデベロッパーツールの『検証』で「Console」を見てみると、確かにConsoleでPHPの情報が見れました!でも、var_dump() のほうが好きだけど、var_dump()が使えない環境では良いかもしれないです、Chrome限定ですが。

※ 開発環境以外では、ChromePhp.phpは読み込まないほうが良いようです。

f:id:ts0818:20170523215143j:plain

 

コメントアウトを外したときのエラーの内容が、

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test\index.php:59) in C:\xampp\htdocs\test\php_module\chromephp-master\ChromePhp.php on line 394

となっていてました。

⇩  下記サイトによりますと、phpのheader関数で起こる現象のようです

よくあるPHP エラー Warning: Cannot modify header information - headers already sent by - ウェブ管理者の日常

 

Chrome LoggerのChromePhp::log() の部分で内部的にheader()関数が使われているってことですかね?

すみません、下記サイトで言及されていました、header()関数を内部で使っているようです。

PHP開発時におけるデバッグ/プロファイリングの手段・ツール3+2選 | 東北ギーク

⇧  また、プロファイリングという言葉も初めて知りました。

 

PHPChrome Loggerを使う際は気をつけたいですね。

ちょっと、しばらくWordmoveから脱線しそうです。

 

⇩  本番とローカルの判定についての参考

PHP - PHPでローカルサーバーかを判定する(37010)|teratail

今回はこのへんで。