LAMP環境のサーバサイドAPIをWindowsでデバッグする 入門編 ステップバイステップ

# はじめに
タイトルだけで内容が想像できる方にとって、本記事は有効な情報はありません。
ん？これってどうやるんだろう？と疑問に感じる方は読み進めてください。

# LAMPについて
LAMP(Linux, Apache, MySQL, PHP)という組み合わせはサーバサイドとしては定番の構成です。
クライアントはWindowsアプリだったりAndroidやiOSなどのスマホアプリだったり、
はたまたウェブアプリだったりと様々ですが、
HTTP(HTTPS)というデファクトスタンダードなプロトコルを使うことによってクライアントを選びません。

データのインプットはGETやPOSTのパラメータ、アウトプットはJSON(JSONP)、XMLなどがありますが、
いずれも様々なクライアント言語でサポートされており、容易にデータのやり取りが行えます。

さらに、すべてをオープンソースのソフトウェアで構成することにより、
安価に構築できるというメリットがあります。
（Windows ServerやOracle等を使う場合はそのライセンス料金を支払う必要があります）

ただし、無料であるということはいいことばかりではありません。
なにかあったときに自己解決しなければいけない、商用ソフトに比べて機能が不足しているなど、
安価な環境には安価な環境の落とし穴があります。

オープンソースのソフトウェアもサポートサービスがあったりしますが、このようなサービスを利用する場合、
大抵はそこにお金がかかります。
こういったメリット・デメリットを十分に吟味した上で、LAMPの導入を検討するとよいでしょう。

# 本題 サーバサイドのデバッグ問題
Visual Studio等のIDEを使用したクライアントアプリの開発に慣れ親しんでいる人は、
当然のようにデバッグ機能を使っていることでしょう。
好きなところでブレイクしたり、処理の流れを追ったり、変数の中身を調べたり、など、
できて当然ですよね。

しかし、ことサーバサイドとなると話は別です。プログラムの実体はサーバにあり、
プログラムはサーバで実行されます。
ソースコードはFTP等でサーバにアップロードしなければなりません。

まず、最初に思いつく方法としては以下のようなものでしょうか。

1. ソースコードを書く
2. サーバにFTPでアップロードする
3. 動作を確認する
4. 上手く動いていなかった箇所があったので、printやechoなどを使って変数のダンプを出力する
5. アタリが違ったら、別の箇所でダンプを出力する

プログラミングの初心者であればまだしも、IDEをバリバリ使いこなしているような開発者がこれをするのは
とてつもない苦行かと思います。
一度便利なものの便利さを知ってしまったら、おいそれと不便な時代には戻れませんよね。

そこで、いかにサーバサイドのプログラムをIDEでデバッグするかについて考えてみます。

## 選択肢1 Sambaを使う
Linux上のファイルをWindowsエクスプローラで扱う方法の定番ですね。
これを使えば、Windowsのファイルを扱うようにLinuxのファイルを扱うことができます。

しかし、これは単に「ファイルをWindowsライクに扱えるようになった」だけであり、
肝心のデバッグ問題は解決していません。

また、LinuxとWindowsではファイルの管理方法やアクセス権の仕組みなどが違うため、
設定でハマったりすることも多いです。
（特にアクセス権周り。全許可なら問題ないのでしょうが、ドメインのアカウントと紐付ける、
などしようとすると難易度が跳ね上がります）

さらにはWinSCPなど最近のFTPソフトはよくできていますので、Sambaでやろうとしていたことを
FTPソフトでできてしまうということもあります。

## 選択肢2 LinuxにGUIを導入し、IDEをインストールする
ある意味正攻法です。
Linux、しかもサーバというとGUIが入っていないことも多いですが、
GNOME等のGUIソフトをインストールしてGUI環境を構築、
そこにLinuxに対応しているEclipse等のIDEを入れて使います。

これなら、Linux上でLinuxのプログラムを動かすので、クライアントのようにデバッグ機能を使うことができます。

ただし、「Linux上で」開発しなければいけないというハードルがあります。
IDEを入れるとはいえ、Windowsとは勝手が違うところもあります。
Linuxでの開発に慣れているならこのやり方でもいいですが、

やっぱり慣れ親しんだWindowsでデバッグしたい！

という場合はこの方法は向いていません。

## 選択肢3 Windowsローカル上にサーバと同じ環境を構築してしまう
これが今回やりたいことです。
サーバの環境とはすなわちLAMPのことです。

Linux, Apache, MySQL, PHP

これらが揃えばLAMP環境の出来上がりです。
ただし、今回はこの中のA(Apache), M(MySQL), P(PHP)のみを構築していきます。
Windows上にLinuxを構築する、というのは仮想マシン等を使えば不可能ではありませんが、
今回の趣旨とはズレてきます。

LAMPで構築されたシステムは基本的にPHP(Apache)でデータをやり取りし、
やり取りしたデータはMySQLに格納されます。

つまり、OS依存のコードはほとんどないことが多いです。

それでも、全くゼロとは限りませんので、OSに近いところを開発する場合はOSの違いに十分注意して
コードを書く必要があります。
場合によっては「ここはLinuxで確認」という部分も出てくるかもしれません。

LAMPサーバとローカル環境は「似て非なるもの」であるということを理解した上で開発するべきでしょう。
もちろん、最終的には本番と同じ構成のテスト環境にアップロードして動作確認することも必要です。

# 環境構築

## XAMPPをインストール
今回は構築の容易さ、シンプルさを重視します。
Apache、MySQL、PHPと個別にダウンロードしてインストールすることももちろん可能ですが、
こだわりがなければすべてコミコミのパッケージを入れてしまいましょう。

それが「XAMPP」です。
https://www.apachefriends.org/jp/index.html

このソフトウェアはApache, MariaDB(MySQL), PHP, Perlがワンセットにパッケージングされているもので、
これをインストールするだけでA, M, Pのすべての環境が整います。

Apache, MySQL, PHPのバージョンは本番環境に近いものがあればなるべく寄せるようにしたほうがよいですが、
あまり神経質に「バージョンが合わない！」と嘆くことはありません。
どちらのバージョンでも動くコードを書けば問題ないのです。

それぞれ注意すべき点は以下です。

・Apache
　単なるWebサーバなので、よっぽど凝ったことをしていない限り、
　バージョン間で動く、動かないの違いはありません。
　ただ、ディレクトリの設定やSSL証明書など、設定が非常に複雑で、設定の違いにより
　動かないという問題が起きる可能性があります。
　Webサーバレベルで問題が出ているときは、まずは設定を疑いましょう。

・MySQL
　こちらはバージョンの違いによりクエリの構文が変わったり、
　使えるものが使えなくなったり、その逆だったり、ということはあります。
　とはいえ、APIで実装するような基本的なSELECTやDMLが突然動かなくなる、
　という可能性は低いです。
　普段使わない構文や関数を含むSQLを作ったらLinuxサーバでも試してみる、
　などするといいかもしれないです。

・PHP
　直接コードに関わるので、最もバージョンに気を使うところです。
　とはいえ、こちらも大きくバージョンが離れていない限りいきなり動かなくなるということは
　考えにくいです。
　PHPという言語は緩やかに変化を続けていますが、いきなりコードが動かなくなるのではなく、
　あるバージョンから「非推奨」となり、非推奨からある程度バージョンアップを重ねたあと、
　「使用不可」となるといった流れをとることが多いです。
　非推奨の場合警告となったりして検知できるので、非推奨になった段階で早めに潰す、
　といった姿勢が大事になります。

　また、フレームワークや各種パッケージなど、拡張機能のインストールでハマることも多いので、
　そういったところにも注意が必要です。
　動かないものは諦めて、動くところだけをデバッグできるようにコードを調整する、といったことも
　ときには必要になるかもしれません。

それでは、XAMPPをインストールしましょう。
Apache, MySQL, PHPにチェックが入っていれば、他はあってもなくても構いません。

インストーラを進めていくだけで完了です。
これでもう動きます。
ソースをビルドしてインストールした経験のある方などは、簡単すぎて逆に不安になるかもしれませんね。

## Apacheを起動、動作確認
まずはApacheの動作確認をしていきましょう。
いきなりAPIのデバッグをはじめようとすると、動かなかったときにどこで動かなかったのか、
切り分けが難しくなります。
ひとつひとつ動作を見ていくのが一番の近道です。

Apacheの起動方法ですが、XAMPP Control Panelを開いて、
「Apache」と書かれた行の「Start」ボタンを押下するだけです。

![apache1.png](https://qiita-image-store.s3.amazonaws.com/0/179875/8e36f346-f881-ef3c-63c0-fb71f91ac20c.png)

すると

![apache2.png](https://qiita-image-store.s3.amazonaws.com/0/179875/4955fda1-dc2e-b448-eb43-affc0e378fc7.png)

起動します。
ポートは80(HTTP),443(HTTPS)を開いてサービスが可動していることがわかります。

では動作確認です。

ブラウザを起動して、アドレスバーに

http://localhost/

と入力してください。

![apache3.png](https://qiita-image-store.s3.amazonaws.com/0/179875/a9e08273-8adc-dd36-c821-f6b50a077a64.png)

XAMPPのウェルカムページが表示されています。
これでもう動いています。

試しに適当なHTMLを配置してみましょう。

配置する場所はApacheで設定しているドキュメントルートの下です。
設定ファイルはXAMPPコンソールの「Config」ボタンから開くことができます。
Apacheの設定ファイルは「httpd.conf」です。

「DocumentRoot」でファイルを検索してみましょう。
初期設定は、

XAMPPインストールフォルダ/htdocs

になっているとかと思います。
ここがHTMLのルートとなります。

ではこのフォルダを開き、直下に「test」というフォルダを作り、「test.html」というファイルを作ってみます。
ファイルの中身にHTMLを記述します。
文字コードは「UTF-8」としてください。

```html:test.html
<html>
<head>
<title>HTMLのてすと</title>
</head>
<body>
HTMLのテストです。
</body>
</html>
```

ファイルを保存したら以下のURLにブラウザでアクセスしてみてください。

http://localhost/test/test.html

![apache4.png](https://qiita-image-store.s3.amazonaws.com/0/179875/f18def93-f9e5-d073-c8b9-dbe9c563c296.png)

## PHPの動作確認
うまくいったら今度はPHPを動かしてみましょう。

さきほどのファイル名を「test.php」に変更し、以下のようにコードを書き換えます。

```php:test.php
<html>
<head>
<title>PHPのてすと</title>
</head>
<body>
PHPのテストです。<?php print date('Y年m月d日');?>
</body>
</html>
```

ファイルを保存したら以下のURLにブラウザでアクセスしてみてください。

http://localhost/test/test.php

![php1.png](https://qiita-image-store.s3.amazonaws.com/0/179875/2a882120-3c5a-59c1-0bbd-abdac8856377.png)

PHPブロックが実行され、現在日時が表示されました。
これでPHPの動作もOKです。

## PHPのデバッガ設定
それではいよいよPHPのデバッガを設定していきます。
PHPのデバッガとして、「XDebug」を使用します。

XAMPにはXdebugモジュールが最初から組み込まれているものと、
そうでないものがあるようです。
現在リリース中のものでは「PHP 5.6.37」のものはXDebugが入っていましたが、
「PHP 7.2.8」のものは入っていませんでした。

XAMPPインストールフォルダ/php/ext
の中に「xdebug」という名前のついたDLLファイルがあれば、入っています。
なければ入っていないのでインストールしましょう。

XDebugのインストールは以下などを参考にしてください。
phpinfo()は状態を出力する関数で、以下のように自身でコードを書いても確認することができます。

```php:phpinfo.php
<?php
phpinfo();
?>
```

XAMPPでApacheを起動している場合は、ウェルカムページの右上にPHPInfoを表示するボタンがあるので、
そちらをクリックして確認していただいても結構です。
（こちらもやっていることはphpinfo()を呼んでいるだけです）

https://qiita.com/threeleafsoft/items/a111e379e1ea03651f19

phpの設定ファイル「php.ini」を開きます。
XAMPPコンソールのApacheのConfigボタンからも開けます。
上記記事にあるようにXDebugの設定を行ってください。

「zned_extension」に設定するxdebugのDLLファイルのパスは環境によって異なりますので、
自身の環境にあるdllのパスを指定するようにしてください。

設定したら、Apacheを再起動します。
コンソールからApacheの「Stop」「Start」を押下して再起動してください。

再起動後、再度phpinfoを確認します。
「xdebug」で検索するとxdebugについての設定が反映されていることが確認できます。

## IDEからデバッガの実行

これでIDEからデバッガの実行が可能になっているはずです。
実際の実行方法は各IDEによって様々ですので、ここではNetBeansでテストを行います。

### NetBeansをインストール
https://ja.netbeans.org/
PHP版、あるいはフルパッケージをインストールしてください。

### プロジェクトを作成

DocumentRoot以下にプロジェクトを作成します。
![php2.png](https://qiita-image-store.s3.amazonaws.com/0/179875/902d60e2-41a0-c68d-d028-19b75457fcac.png)

プロジェクトURLを設定します。
ここで設定したURLが実行パスとなります。
![php3.png](https://qiita-image-store.s3.amazonaws.com/0/179875/76413867-679c-f898-e88d-8d4d24d2d82b.png)

### デバッグ実行
index.phpを以下のように書きます。

```php:index.php
<?php
    $hoge = 1;
    $fuga = array("apple", "orange", "grape");
    $piyo = $hoge + 3;
```

$piyoの行番号のところをクリックしてください。
赤いアイコンが表示され、ブレイクポイントが張られます。

実行ボタンの右隣にあるデバッグ実行ボタンを押下してください。
![php4.png](https://qiita-image-store.s3.amazonaws.com/0/179875/aff9c6e8-2134-ba10-58b1-33621183119d.png)

以下のようにブレイクポイントで処理が止まり、変数の中身などが参照できます。
![php5.png](https://qiita-image-store.s3.amazonaws.com/0/179875/01d023df-1694-c8ff-3982-ad96cae75bf4.png)

あとはIDEの機能にもよりますが、ステップイン、ステップオーバー、ステップアウト、呼び出しスタックなど、
デバッグに必要な機能は一通り揃っているので、クライアントアプリの開発と同じようにデバッグできます。

## MySQL環境構築

次にMySQLの環境を作っていきます。
Apacheと同様、サービスの開始は「Start」ボタンを押下するだけです。

![mysql1.png](https://qiita-image-store.s3.amazonaws.com/0/179875/8ee0e6e1-e22d-2027-1578-22ae224e37f6.png)

Apacheと同様、待ち受けポートが表示されます。
MySQLのデフォルトである3306ポートで待ち受けがされているのがわかります。

![mysql2.png](https://qiita-image-store.s3.amazonaws.com/0/179875/610b6593-302d-e220-b4d5-2aaa4e7570d6.png)

ただ、この段階では何も入っていない空っぽのDBです。
ユーザやDBの作成を行ってください。

XAMPPコントロールパネルの「Shell」ボタンからプロンプトを開くと、
mysqlコマンド等にパスが通った状態で使うことができます。

また、サーバAPI等であればテストサーバにテストDBが構築されているケースも多いでしょう。
そういった場合はそのDBをダンプしてローカルのDBにリストアすると
簡単にサーバ側と同じ環境を作ることができます。

データのダンプやリストアはHeidiSQLやSQL Workbenchなどの
MySQLクライアントGUIソフトを利用すると便利です。
https://www.heidisql.com/
https://www.mysql.com/jp/products/workbench/

普段MySQLサーバに接続する際にはサーバ名やポートを指定していると思いますが、
XAMPPでローカル環境で動かしているので、ホスト名は「localhost」、
ポートは（デフォルトのままなら）「3306」で接続できます。

以下はHeidiSQLの設定画面。初期状態ではrootにパスワードが設定されていないのでこの状態で繋がります。
![mysql3.png](https://qiita-image-store.s3.amazonaws.com/0/179875/a6d9e4c8-02d0-8342-8f3d-bcdb0c404177.png)
適宜パスワードの設定や必要なユーザ、データの作成などを行ってDBを構築してください。

以下、テストで作ったDBとテーブル、データ。
![mysql4.png](https://qiita-image-store.s3.amazonaws.com/0/179875/1c93e758-cd38-19b2-a3a4-82f4e200e6b5.png)

上記にアクセスするPHPとデバッグ。
DBのデータを正しく取ってこれていることが確認できます。

```php:index.php
<?php
    $mysqli = new mysqli("localhost", "test", "test", "debug_test");
    $result = $mysqli->query("SELECT * FROM test");
    $row = $result->fetch_assoc();
    var_dump($row);
```

![mysql5.png](https://qiita-image-store.s3.amazonaws.com/0/179875/7efbcaa9-7d38-3c88-7d27-ec6711e08946.png)

# トラブルシュート

## Webサーバにつながらない

・Apacheは起動しているか
・エラーログの確認

## PHPが動かない

・Apacheの設定は正しいか
・PHPの設定は正しいか

## デバッガ(XDebug)が動かない

・XDebugモジュールはインストールされているか
・php.iniの設定（特にパス）は正しいか
・IDEの設定は正しいか

## MySQLにつながらない

・MySQLは起動しているか
・接続設定は正しいか
・DBは正常に作成されているか
・ユーザの設定、権限付与等は正しく行われているか

# おわりに
ほんとうは難しくないサーバサイドAPIのローカルデバッグですが、ハマってしまうと切り分けが難しい、
という側面もあります。
そんな中でローカルデバッグを諦めてしまった人たちのためにこの記事を書きました。
ローカルでサーバの構築、メンテが必要であること、サーバと完全一致の環境にはならないことなどのデメリットを
差し置いても、ローカルでデバッグできる環境の生産性は捨てがたいものがあります。
どうか実際にやってみて、その利便性を実感いただければ幸いです。

# 次回
次回はこちら
[実用編](https://qiita.com/mintcandy/items/39598c019dc6ba4a074f)

今回紹介した内容は、デバッグ環境構築のHello World的な部分でした。
実際の開発現場ではもう少し込み入った要件や条件等あるかと思いますので、
次回は現場のAPIデバッグについて細かいテクニックなどを紹介していきたいと思います。