LoginSignup
9

More than 3 years have passed since last update.

posted at

updated at

【PHP】ローカル環境でオペコード(phpdbg・vld)を表示する

はじめに

ローカル環境でオペコードを表示したときの覚書です。
私のように「文字入力して指示するの?」「黒い画面?」「なにそれ怖い」という超初心者の方にとって、オペコードを表示するのは少し敷居が高いと思います。
そのような方の参考になれば幸いです。

私の環境は下記の通りです。

OS XAMPP Apache PHP
Windows10 5.6.24 2.4.23 5.6.24

この記事では、オペコード自体に対する説明はありません。
オペコードについて詳しく知りたい方は下記が参考になると思います。
この記事の対象者には(私にとっては)レベルが高くて難解ですが、詳説です。

オペコードを表示する方法は、2つあります。

一つ目は、phpdbg で確認する方法です。
PHP5.6以降をお使いなら、何もせずにオペコードを表示できます。
ただ、表示されるオペコードが少し見づらいです。

もう一つがPECLとして提供されている Vulcan Logic Disassembler(vld) という拡張ライブラリを使って確認する方法です。
PHPマニュアルやWikipediaなどで「拡張モジュール、拡張ライブラリ、拡張パッケージ」と表記が揺れますが、ここでは同義として扱い、拡張ライブラリと表記します。(というか私がそれぞれの違いを説明できないです(´ω`;))

この記事の対象者ならPECLて何?って方がほとんどだと思いますが、下記のWikipediaの説明がわかりやすいです。

PECL(ピクル、PHP Extension Community Library)は、PHPで利用できる拡張ライブラリ(パッケージ)を提供しているサービス。

PECLで提供されるライブラリはCで記述されているため、PHPで記述されたPEARのライブラリよりも高速に動作する。PECLにより提供されるライブラリはPHPの拡張モジュールとしてインストールされる。一方で、PEARライブラリはPHPのバージョンアップに伴う再インストールが原則として不要なのに対し、PECL拡張モジュールはPHP内部のAPIに依存する部分があるため、PHPのバージョンアップに伴いAPIが変更された場合は再コンパイルを必要とする。

PECLのインストール用には、PEAR同様に「pecl」コマンドが提供されている。インストール方法もほぼPEARと同じだが、インストール後に設定ファイル(php.ini)の「extension」でインストールしたモジュールを指定する必要がある点が異なる。なおWindows版では、手動でphp.iniを修正して、あらかじめコンパイル済みのPECL DLLを組み込むのが一般的な方法である。

ここで覚えておくことは、PHPで利用できるモジュールは、PECLとPEARという2つあるということ、PECLはC言語で記述されており、PHPのバージョンアップに伴い、新しいバージョンに対応した拡張モジュールに変更する必要があるということです。
また、PECLの拡張モジュールをインストールするときは、php.ini の記述を変更する必要があるということです。

今回使うvldというライブラリは、これだけインストールすれば動作します。
使うライブラリによっては、○○ライブラリを使うのに△△ライブラリが必要ということがあります。
○○ライブラリと△△ライブラリを2つインストールする必要があり、手間です。
ライブラリ管理ツールと呼ばれる Composer(コンポーザー)というのを使うと関連するライブラリを自動でインストールしてくれます。
非常に便利です。
これからPHPやるぞって方は、Composerについても抑えておくと役立つと思います。
ただ、関数やクラスの基本的な書き方を覚えたぞっていう段階の方は、すぐにComposerについて覚える必要はないと思います。
ライブラリ使いたい、CakePHPなどのフレームワークを使いたいというタイミングで覚えれば良いかと思います。
偉そうに言ってますが、私もComposerを2・3回しか使ったことありません(´ω`;)
ここでは、Composerというのが存在しますという説明のみですので、興味のある方は調べてみてください。

それでは、オペコードを表示する方法を見ていきましょう。
XAMPPはインストール済みとします。

phpdbgを利用する方法

PHP5.6以降ならphpdbgでオペコードを表示できます。
仮に C > xampp > htdocs > a.php にある a.php のオペコードを表示するとします。
a.phpは下記のように記述しています。

PHP(a.php)
<?php
echo 'Hello';

管理者権限でコマンドプロンプトを開きます。
おそらくコマンドプロンプトの初期値ではCドライブのユーザーフォルダにいるかと思います。
a.php がある xampphtdocs のディレクトリに移動するために下記のように記述します。

> cd \
> cd xampp\htdocs

これで、htdocs のディレクトリに移動しました。
下記のように記述してphpdbgを使ってオペコードを表示します。

> phpdbg
> exec a.php
> print exec

下記のようにオペコードが表示されます。

phpdbg.jpg

C0C1は定数を表しており、info literalを叩くと値が表示されます。

phpdbgには様々なコマンドがあり phpdbg 簡易マニュアル · GitHub が参考になります。

phpdbgを終了したいときは q を入力すると終了します。

次は、vldを利用する方法を見ていきましょう。

vldを利用する方法

Macなら @syossan27 さんが書いた下記の方法で、vldを利用できるようになるかと思います。

Windowsだと少し異なるところはありますが、 @syossan27 さんの記事を参考にオペコードを表示することができました。
ありがとうございます((_ _ (´ω` )ペコ
Windowsへのインストールする方法が異なるということは、PHPマニュアルにも書いてあります。
Windowsの場合ですが、下記の4つのステップでvldライブラリを追加できます。

  1. vld のデータをダウンロードする
  2. ダウンロードしたファイルを拡張ライブラリのディレクトリに設置する
  3. php.ini に記述を追加する
  4. オペコードの表示

手順さえわかれば、簡単です。
順を追って見ていきましょう。

1.vld の拡張ライブラリのデータをダウンロードする

vld のダウンロード先へアクセスします。
vld-0.12.0.tgz (16.2kB) の横にあるウインドウズマークのDLLを選択します。

vld1.jpg

先ほど、PECLについて下記のように説明しました。

PHPのバージョンアップに伴い、新しいバージョンに対応した拡張モジュールに変更する必要があるということです。

PHPのバージョンによって異なるため、下記のようにバージョンごとにダウンロードするファイルが異なります。

vld2.jpg

私は PHP5.6 を使っておりますので、PHP5.6の DLL List から選択します。
DLL List には4つあります。
x86 は32bit版のWindowsで、x64 は64bit版のWindowsです。
他に Non Thread Safe(ノンスレッドセーフ) と Thread Safe(スレッドセーフ) があります。
これは、PHPをモジュール版として動作させているのか、CGI版として動作させているかによって異なります。
モジュール版として動作させている場合は、Thread Safe を選択します。
CGI版として動作させている場合は、Non Thread Safe を選択します。
XAMPPの初期設定なら、モジュール版として動作していると思いますので、Thread Safe を選択すれば良いかと思います。
モジュール版かCGI版かは、phpinfo()で確認できます。
Server API の項目で Apache 2.0 Handler が表示されていれば、モジュール版です。
Server API の項目が CGI/FastCGI が表示されていれば、CGI版です。

phpinfo1.jpg

お使いの環境にあわせて、ダウンロードしてください。

2.ダウンロードしたファイルを拡張ライブラリのディレクトリに設置する

ダウンロードしたzipファイルを解凍するといくつかファイルがありますが、 php_vld.dll のみ使用します。
php_vld.dll を拡張ライブラリのディレクトリに設置します。
XAMPPを使用している方なら xampp > php > ext の中に php_vld.dll を設置します。
拡張ライブラリのディレクトリは、phpinfo() で確認できます。
extension_dir の項目にディレクトリのパスが記述されておりますので、拡張モジュールのディレクトリが不明な方は phpinfo() で確認してください。

phpinfo2.jpg

3.php.ini に記述を追加する

php.ini テキストエディタで開きます。
XAMPPの環境なら、php.iniのファイルは xampp > php > php.ini にあります。
php.ini に下記を追記します。

extension=php_vld.dll

4.オペコードの表示

オペコードを表示するには、コマンドプロンプトを使用します。
phpdbgのときと同様に a.php のオペコードを表示します。
a.phpがあるhtdocsのディレクトリまで移動したと仮定します。
a.phpというファイルのオペコードを表示したいときは、コマンドプロンプトで下記のように記述します。

> php -d vld.active=1 -d vld.execute=0 a.php

これでオペコードが表示されます。

vld.jpg

下記のようなエラーが表示されるときは、ダウンロードしたファイルが使用している環境と異なっています。
適切なファイルをダウンロードしてください。

有効な Win32 アプリケーションではありません。

note

note でも記事を公開してるので、興味がある方はご覧ください。

【初学者向けコードリーディング】 PHP の TODO アプリのコードを一緒に読み解こう

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9