Windows」タグアーカイブ

PHPをWindows 10上のVisual Studio Codeを使って「Webサーバなしで」デバッグする方法

Windows 10でPHPをサーバサイド開発ではなく、VBScriptやPowerShellと同じようにローカルで実行するスクリプトとして使っている。

MicrosoftのVisual Studio Codeを使えばIntellisenseの自動補完でコーディングもできて便利だが、どうすればデバッグでステップ実行ができるのか、ネットで調べ始めた。

とりえあずXdebugというPHPの拡張機能(DLLファイル)が必要なことは分かった。

Xdebug – Debugger and Profiler Tool for PHP

ところが、Xdebugの使い方について、リモートのWebサーバやローカルにApacheかIISで構築したWebサーバでPHPを動かす前提の記事ばかりで参考にならない。

試行錯誤してようやくWebサーバなしでデバッグする方法が分かった。

すでにPHPスクリプトは実行できる状態になっているとする。

(1) XdebugのDLLのダウンロード

上記リンク先からXdebugのDLLファイルをダウンロードし、PHPのインストールフォルダ配下の「ext」フォルダ内に保存する。長いファイル名のままでいい。

ただしダウンロードするDLLファイルのバージョンを間違えないこと。

正しいバージョンをダウンロードするには、Windowsのコマンドラインで「php.exe -i」を実行、出力結果部分だけをコピーし、Xdebugの下記ページに貼り付け、「Analyse my phpinfo() output」ボタンをクリックする。

Xdebug: Support; Tailored Installation Instructions

すると正しいバージョンのダウンロードリンクが自動的に表示される。

(2) php.iniファイルの編集

php.iniファイルの冒頭に以下の内容を追記する。

zend_extension = C:\php\ext\php_xdebug-2.7.2-7.3-vc15-x86_64.dll
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = 127.0.0.1
xdebug.remote_port = 9000

「zend_extension」の後のDLLファイルのフルパスは、自分がダウンロードしたDLLファイルのフルパスに適宜変更すること。その他はこのままコピペすればよい。

Webサーバなしでなのに、どうしてremote_hostやremote_portの指定が必要なのかと思うが、これらの記述がないとXdebugが動いてくれないので、何も考えずに記述すること。

ここまででXdebugが正しく動くかどうかは、コマンドラインプロンプトで先ほどの「php.exe -i」を再度実行し、以下のメッセージが表示されないことを確認すればよい。

Failed loading C:\php\ext\php_xdebug-2.x.x-x.x-vc15-x86_64.dll

(3) Visual Studio Codeに拡張機能 PHP Debug をインストール

Visual Studio Codeを起動、メニューの「表示>拡張機能」をクリック。

画面左上に「Marketplace で拡張機能を検索する」という入力欄が出てくるので「PHP Debug」と入力。緑色の「インストール」ボタンをクリックする。

ついでに「PHP IntelliSense」がインストールされていなければ、「PHP IntelliSense」と入力。同様に緑色の「インストール」ボタンをクリックしてインストールする。

(4) 編集するPHPファイルのあるフォルダを Visual Studio Codeで開く

筆者はここでつまずいた。PHPファイルを編集するんだから、そのPHPファイルを開けばいいと普通は思う。

しかしXdebugでデバッグするには、PHPファイルのあるフォルダを開く必要がある

Visual Studio Codeを起動したら、メニュー「ファイル>フォルダーを開く…」をクリックする。

そして編集したいPHPファイルのあるフォルダを開いて「フォルダーの選択」ボタンをクリックする。

その後、メニュー「表示>エクスプローラー」をクリックし、左側に選択したフォルダ内のファイル一覧が出てきたらOK。

本来、Visual Studio Codeはフォルダ単位(プロジェクト単位)でPHPをコーディングするもので、PHPファイルを単体でコーディングするものではないので、ファイルではなくフォルダーを開くのが正しい。

(5) 編集したいPHPファイルを開く

左に表示されたフォルダ内のファイル一覧で、編集したいPHPファイルをクリックすると、右側のエディター部分にPHPファイルの中身が表示される。

(6) launch.json ファイルを作成する

このlaunch.jsonファイルをどうやって作成すればいいのかが、どの記事にも書かれていなかった。

メニュー「デバッグ>構成を開く」をクリックすればいい。

すると開いているフォルダ内に「.vscode」というフォルダが自動作成され、その中にlaunch.jsonファイルが自動作成される。

そして自動作成されたlaunch.jsonがエディター画面に自動的に開く。

中身はだいたい以下のようになっているはず。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}

このうち後半の「Launch currently open script」の設定部分の「”port”: 9000」という行の直下に、次のような行を追加する。

"runtimeExecutable": "c:\\php\\php.exe"

runtimeExecutableというパラメータに、php.exeのフルパスを指定する。フルパスは自分の環境に合わせて正しく指定すること。

さらに、前半の「Listen for XDebug」のパラメータ設定部分をまるごと削除してしまう。

launch.jsonファイルの中身全体は以下のようになる。太字部分が追加した1行。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
            "runtimeExecutable": "c:\\php\\php.exe"
        }
    ]
}

編集したらメニュー「ファイル>保存」やCtrl + Sで保存し、このJSONファイルのタブは閉じてしまっていい。

(7) デバッグしてみる

以上で準備はととのったので、実際にデバッグしてみる。

何度も書くが、PHPファイルを単体で開くのではなく、あくまでメニュー「ファイル>フォルダを開く…」でフォルダを開くこと。

つまり左側に開いたフォルダ内のファイル一覧を表示できる状態にすること。(左上隅の書類のアイコンをクリックすると表示、非表示を切り替えられる)

そのファイル一覧からデバッグしたいPHPファイルを開く。

そして適当な場所にF9キーでブレークポイントを設定してみる。(行頭に赤丸が付く)

F5キーでデバッグ実行を開始する。(Ctrl + F5だとデバッグなしの単なる実行になる)

するとデバッグ実行の状態になり、F10やF11でステップ実行ができる。

上記で「launch.json」ファイルから「Listen for XDebug」のデバッグ構成部分を削除したのは、この構成ではステップ実行のデバッグができないため。

上記で削除しておいたので使えるデバッグ構成は「Launch currently open script」のみとなり、正しくステップ実行ができる。

ついにWebサーバなしでPHPのデバッグができるようになった。

(8) 他のフォルダにあるPHPファイルをデバッグする場合

ここまででお分かりのように、PHPファイルのあるフォルダ配下に「.vscode」というフォルダと、そのフォルダ内に上記の「launch.json」と同じ内容の「launch.json」ファイルが必要になる。

そのつど上記の手順で作成するのは面倒なので、「.vscode」フォルダごとコピペすればいい。

これでechoやログファイルへの書き出し結果を見ながらデバッグをする手間がなくなり、楽しくPHPをスクリプト言語として使える。

Appleの競争力と商業音楽の関係について

今さらながら、ふとしたことから、Apple製品の競争力の源泉について考えさせられた。
ご承知のように、MacintoshやiPhoneなどのApple製品は、ふつうの会社員よりも、クリエイティブな仕事をしている人たち、ミュージシャン、イラストレーター、ディレクターなどに圧倒的に人気がある。
それは、単にApple製品のデザインが、たとえばWindowsパソコンの大多数が無骨なのに比べて、洗練されているからだと思っていたが、もっと本質的な理由があるんじゃないかと気づいた。
それは、競争がないことだ。
最近、スマートフォンの分野でグーグルのアンドロイドOSが、急速にシェアを伸ばしているが、WindowsパソコンとMacintosh、そして、Android端末とiPhoneを比較すると、Apple製品はつねに競争がないところで一定のシェアを確保していることがわかる。
Windowsパソコンはハードウェアの規格が、Android端末はOS(基本ソフト)と対応ハードウェアの規格が公開されているので、世界中の無数のメーカーが参入して製品を発売し、価格面や性能面など、いろいろな点の優位性を競う激しい競争が起きる。
一方、Macintoshは少なくともハードウェアの規格は、OSがUnixベースになり、インテル製CPUに対応するまでは、非公開だったし、iPhoneはOSもハードウェアも規格は非公開だ。(もちろんアプリケーション開発の規格は公開されているが)
なので、Appleが独占的に製造でき、同じ規格の中での競争にさらされることがない。
競争がないので、製品コンセプトやデザインを、Apple社の思うままにできるのは、ある意味、当然だ。
iPhoneのヒットは、iPodのヒットがあってこそで、さらにそれはMacintoshのヒットがあってこそだが、MacintoshがWindowsパソコンに完全に淘汰されることがなかった点は、たしかにApple社のマーケティングの勝利だろう。
そしてそのマーケティングの根っこにある思想は、「同じ規格内での競争をしなくてよい創造性」というようなものだったに違いない。
この「同じ土俵で競争しなくていい創造性」という思想は、創造性より効率性が求められるふつうの会社員にはまったく無縁だが、創造性や個性そのものを売りにして生活しているクリエイターたちには、ぴったり来るものだったはず。
だからApple製品はクリエイターたちの根強い支持を得て、その思想がiPod、iPhoneと受け継がれ、市場全体で見ても確実に一定のシェアを確保しつづけることができたのだろう。
どうしてこんなことを今さら考えさせられたのかと言うと、商業音楽(ポップスも演歌も含む)のクリエイターは、クラシック音楽の担い手たちと比べたとき、「競争のない創造性」という思想が当てはまるだろうかと、ふと疑問に思ったからだ。
商業音楽に競争がない、なんてことはない。CDやコンサートのチケットが、少なくとも創り手の再生産を支えるだけの売上をあげなければ、商業音楽は成り立たない。
それだけの売上をあげるためには、他の商業音楽との競争で勝たなければいけない。
だから商業音楽にはヒットチャートというものが存在する。ふつうの産業製品と同じように、商業音楽は音楽としての良し悪しとは無関係に、商品として、数量や金銭という一つのモノサシで比較される。
なので、いくら音楽の聴き手の耳がヒドくても、聴き手の音楽に対する考え方がお話にならなくても、商業音楽の創り手は聴き手に「媚び」を売らなければならない。
一定数の聴き手を獲得できなければ、商業音楽は成り立たないからだ。
逆に言えば、聴き手に媚びず、送り手側の妥協のない創造性だけで商業音楽は成り立つと勘違いしたが最後、それは商業音楽にとって自殺行為になってしまう。
ただ、一つだけ可能性があって、商業音楽の世界にもApple社のようなスタンスが安定して存在するかもしれない、ということだ。つまり、「競争のない創造性」を体現できる立ち位置が。
しかし、Apple社のスタンスが安定して成立するには、「規格の非公開」という大前提が必須だった。果たして商業音楽を作るときに、規格を非公開にすることなどできるだろうか。
このテーマについては、まだいろいろと考えることができると思うが、この記事はこの辺でおしまい。