Help us understand the problem. What is going on with this article?

【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 アプリのコードを一緒に読み解こう

7968
学んだことを投稿していきます。誤りがあればご指摘ください。 note でも記事を投稿しています。
https://note.com/7968
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした