ただいまインターン最終日の定時を迎えています。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が使えなくなってしまうのでやめておきます。
と、あまり大した内容じゃないくせに長くなってしまいました。以上にしたいと思います。ありがとうございました。




