ハマログ

株式会社イーツー・インフォの社員ブログ

XAMPPでXdebugのON/OFFを簡単に切り替えられるようにした

ただいまインターン最終日の定時を迎えています。nomiです。期間は1ヶ月以上あったはずなのにもう最終日とは早いものです。私はこのインターンを通じて圧倒的な成長を遂げました。圧倒的かは評価が分かれるかもしれませんが、少なくとも〈雇われプログラマ Lv.3〉くらいにはなれたと思うので、今回はコーディングした記事を書きたいと思います。

実のところ、この機会にEC-CUBEでIoTっぽい何かでもやりたいと思っていたのですが、遊ぶ時間が無かったので諦めました。そのうち機会があれば「マイコンで取得した温度センサの値に応じて価格がショッピングサイト」とか「マイコンを振れば振るほどポイントが貯まるショッピングサイト」とかを作ってみたいものです。

今回はタイトル通り「XAMPPでXdebugのON/OFFを簡単に切り替えられるようにした」方法を紹介します。実は、私が前回投稿した記事で、

デバッグ実行が便利

ブレークポイントを設置して、コードを1行ずつステップ実行するあの機能です。

などと書いていたら、社内チャットで話題にあがりました。その中で「XdebugモジュールをONにするとXAMPP周りが重くなるから注意」「なんか切り替え方法ないかなー」といった意見を見たので、やってみます。面倒なことはPy…PHPにやらせます。

というわけで、コードがこれです。WindowsのXAMPP向けですが、少しいじれば他環境でも使えそうです。

<?php

const XAMPP_ROOT_DIR = "C:\\xampp\\";
const PHP_INI_FILE = XAMPP_ROOT_DIR . "php\\php.ini";

// php.iniの操作
phpIniToggle();

// Apache再起動 `httpd -k restart`
echo "apache_stop\n";
apacheStop();
sleep(1);
echo "done\n\n";

echo "apache_start\n\n";
apacheStart();

// スクリプトの終了
echo "exit\n"; //この行到達時にはapacheが既に終了しているはず
sleep(1);
exit(0);


// php.iniでxdebugの編集
function phpIniToggle() {
$phpIniStr = file_get_contents(PHP_INI_FILE, "w+");

$count = 0;
$phpIniStr = preg_replace('/^\s?;\s?(zend_extension.*)/m', '$1', $phpIniStr, 1, $count);
if ($count == 1) {
echo "Xdebugを有効化したよ\n";
file_put_contents(PHP_INI_FILE, $phpIniStr);
return;
}
$count = 0;
$phpIniStr = preg_replace('/^\s?(zend_extension.*)/m', ';$1', $phpIniStr, 1, $count);
if ($count == 1) {
echo "Xdebugを無効化したよ\n";
file_put_contents(PHP_INI_FILE, $phpIniStr);
return;
}
echo "ふぇぇ…!\n";
}

// apache_stop.bat
function apacheStop() {
exec(XAMPP_ROOT_DIR . "apache\bin\\pv -f -k httpd.exe -q");
$delLogFile = XAMPP_ROOT_DIR . "apache\\logs\\httpd.pid";
if (file_exists($delLogFile)) {
unlink($delLogFile);
}
}

// apache_start.bat
function apacheStart() {
exec("start /b \"\" ". XAMPP_ROOT_DIR . "apache\\bin\\httpd.exe");
}

長いように見えますが、60行未満の簡単なコードです。基本的には手動でやったときの

  • php.iniからXdebugの部分を探して編集する
  • Apacheを再起動する

この作業をPHPで書いただけです。これで、php.exeにファイルを渡してあげるだけで、XdebugのON/OFFが切り替えられるようになりました。

なお、PHPのプロセスでApacheを起動してしまっているためか、Apache起動後もxdebug_toggle.phpが開いたままになってしまいます。このウィンドウを閉じるとApacheも終了してしまうのが難点です。また、私の環境だとapache_stop.batを呼び出すだけだといまいちうまくいかなかったので、バッチファイルをPHPに書き直しました。

こんな感じにデスクトップにショートカットを置いておくと、気が向いたときにON/OFFを切り替えられますね。


今回はON/OFFを切り替えるだけですが、PhpStormのデバッグ設定を見てみると

起動前とかツールとか書いてあるので「PhpStormのデバッグボタンを押すとXdebugがONになる」くらいだったらできそうです。私はもうPhpStormが使えなくなってしまうのでやめておきます。

と、あまり大した内容じゃないくせに長くなってしまいました。以上にしたいと思います。ありがとうございました。

debugPHPPhpStormXdebug

  nomi   2019年3月31日


関連記事

Amazon Linux 2にSupervisorを設定する

Laravelでキューワーカー(Queue Worker)を実行するために、Am…

AWSに設置したphpMyAdminにBasic認証を設定/特定のIPアドレスによる制限

AWSで、ELB→EC2の環境にphpMyAdminを設置しました。 yumコマ…

APC導入でPHPのパフォーマンスアップ

こんにちは池島です。PHPにAPCを導入したのでその時の記録を書きます。 導入し…


← 前の投稿

次の投稿 →