内部処理
PHP のコア: ハッカーの手引き
うーん、なんか気が遠い。
C言語やコンパイラの知識とかもないし、興味はあるけどコンパイラのコードを読むのはひとまずあとまわしかな。
HHVMも気になるけど。
むしろ先にデザインパターンとか設計とかその辺を調べるつもり。いや、どうかな。。うーん。
7つの言語 7つの世界よむのと平行してコンパイラのソースをみたりしたいけど予定は未定。
重要な内部機能はすべて取り上げますが、きちんと理解するには結局はソースを読むことです。
このセクションを読むための前提条件は、C 言語やそれに関連するツール (コンパイラやターミナルエミュレータなど) に関する知識があるということです。別に次代のアラン・チューリングを目指せというつもりはありませんが、 ここで扱う内容を実際に試してみるにはそれらの知識が不可欠なのです。 前提条件を満たす人は、ここで扱う内容を理解すれば ハッカーへの道を進めるようになるでしょう。
PHPの振る舞いの変更
APC — Alternative PHP Cache
現状では関数呼び出して活用するところまではやってない。
APD — Advanced PHP debugger
いまのところdumpしてばかりなので使ってないけど使いたい場面が出てくるかな。
bcompiler — PHP バイトコードコンパイラ
Bcompiler は、以下のような目的で作成されました。
プロプライエタリな PHP アプリケーションのスクリプト全体をエンコードするため
プロプライエタリな PHP アプリケーションの一部のクラスや関数をエンコードするため
クライアントのデスクトップで動作する php-gtk アプリケーションを、 php.exe を用いずに実行させるため
PHP から C へのコンバータの実現可能性を調べるため
bcompiler で作成した バイトコードファイルからデータを取り出すことは可能です。 個人的なパスワードなどの情報をバイトコードの中に含めないでください。
http://shimax.cocolog-nifty.com/search/2014/10/phpwebexephpexe.html
WEBアプリをexeファイル化できる上に、PHPソースはBcompilerで暗号化されているので、ソースが漏れる心配もほとんどありません。WEBアプリケーションを安全に配布したい人にはお勧めの商品です。
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A8%E3%82%BF%E3%83%AA%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2
プロプライエタリ・ソフトウェアとは、ソフトウェアの配布者が、利用者の持つ権利を制限的にすることで自身の利益を保持しようとするソフトウェアを指す。
なるほど面白い。
windowsで動く簡単な業務アプリをphpでお手軽生成したりできるってこと?
HHVMを導入はしてないけど、重たい処理をコンパイルしておいて呼び出して高速化したり、外部コマンドから呼び出し可能にするとか?
どうだろう、有効なのかな。
お手軽にjson_decodeして配列にしてまたエンコードとかの処理を軽くしたりできないかな。
htscanner — すべての SAPI での htaccess 風機能のサポート
http://phpterm.e1blue.net/php/continuation/1
http://php.net/manual/ja/configuration.file.per-user.php
この機能は、PECL htscanner 拡張モジュールを置き換えるものです。 Apache を使用している場合は .htaccess ファイルを使えば同じ機能を実現できます。
なるほど、バージョンさえあえば使うことはなさそう。
.user.iniってつかえるのしらなかった。mod_fcgidの場合もこれにあたるってことだよね。
パフォーマンス的にどの手法が良いのかとか明記は無いけども。
inclued — インクルード階層ビューア
http://php.net/manual/ja/inclued.examples-implementation.php
なるほど、あまり使いそうに無いけど知っておいていいかもな。
Memtrack
http://www.phppro.jp/phpmanual/php/intro.memtrack.html
この拡張モジュールは、最もメモリを食うスクリプトや関数がどれなのかを調べます。
memtrack は、PHP スクリプトのメモリ消費を追跡し、 ユーザーが設定したあるレベル以上に達したときに報告 (警告) します。 これを実現するために、デフォルトのエグゼキュータ関数を置き換えています。 この特別な関数で、本来のエグザキュータを実行する前後のメモリ使用量を比較しています。 こうすることで、コードの現在の部分でメモリ使用量がどれだけ変化したかを知ることができます。
デバッグするのに知っておくと良さそうな予感がする。
OPcache
http://php.net/manual/ja/intro.opcache.php
http://www.1x1.jp/blog/2013/04/php55_replace_apc_with_zend_opcache.html
過去バージョンではAPCとの比較とかでそこまで優位でもないから使ってなかったけど今後は使いそうかな。
ユーザーキャッシュ(オブジェクトや変数をメモリに保存して、別のリクエストからそれを再利用する)にはAPCuを使うらしい。
内部的にはどう違うのか。キャッシュの単位がopcodeとかいうような感じ?
uopz
http://ngyuki.hatenablog.com/entry/2014/07/06/180723
概ね runkit と同じようなことが出来るようですが・・・
uopz_overload() 関数を使うと、一部の opcode をオーバーロードできます。
黒魔術的なことなのかな。。
new のオーバーロードを使えば DI っぽいことが new で実現できそうな気がしたのでやってみました。
サポートされていない記法をつかえるようにしたりできるということか。
Weakref — 弱い参照
サンプルコードは面白いけど、使いどころはよく分からない。
Xhprof — 階層型プロファイラ
どこかに便利と書いてあったので、使ってみるようにしたらいいかなとは思ってるところ。
PHP バイトコードコンパイラ (bcompiler)
PHPとJITコンパイラ
HHVMはPHPのコードをダイナミックにバイナリコードへと変換することで、高速な実行の実現を目指しています。
実行時コンパイラ(Just-In-Time Compiler、JITコンパイラ、その都度のコンパイラ)とは、ソフトウェアの実行時にコードのコンパイルを行い実行速度の向上を図るコンパイラのこと。通常のコンパイラはソースコード(あるいは中間コード)から対象CPUの機械語への変換を実行前に事前に行い、これをJITと対比して事前コンパイラ (Ahead-Of-Timeコンパイラ、AOTコンパイラ)と呼ぶ。
...
JIT方式ではモジュールやクラスといった比較的大きい単位で機械語に変換しているのに対し、インタプリタ方式では行ごと、ステートメントごとなどのごく小さい単位となる。 また、インタプリタ方式と同様に実行時にJava仮想マシンや共通言語ランタイムのようなランタイム環境を必要とする。
デバッグ
あまりデバッグ使ってないなあ。var_dumpで済ませてしまう。気軽につかうようにしたいところ。
そういえばHHVMのデバッグってどうなってるのかな。
gdb
■おまけ
apache組み込みDSOのPHPを用いて、ウェブアプリケーションとしてPHPを利用してい
る場合にも、以下のようにGDBを利用可能です。
なるほど、便利。
phpdbg
これまでも gdb や xdebug でデバッグを行うことができましたが、別途インストールや設定が必要でした。
PHP 5.6 から、phpdbg が同梱されることで、PHP が入っている環境では、手軽にこのデバッガを利用できるようになります。リモートデバッグにも対応しており、いずれ PhpStorm のような IDE でも対応されるかもしれません。
phpdbg 自体は 5.4 からインストール可能ですので、ちょっと試してみようという方はインストールしてみてください。
macに複数バージョンのPHPいれるようにして試してみようかな。