はじめに
プログラミング言語であるPHPは、オープンソースとしてその処理系のソースコードも公開されていて、誰でも中身を見ることができます。PHPの処理系そのものはC言語で書かれているので、PHPの実行の仕組みを理解するにはC言語の知識が必要となります。それなりに歴史があるプロジェクトなので深くまで探ろうとすると骨が折れますが、きちんと整理されたソースコード構成になっているので概要をざっくり把握するのはさほど大変ではありません。
この記事では、なんとなくPHPのソースコードに触れてみたいという人に向けての簡単なガイドを目指して、解説していこうと思います。なお対象とするPHPのバージョンは、執筆時時点の最新版であるPHP-8.3.9です。
PHPソースをダウンロードしてみよう!
まずPHPのソースをダウンロードして展開してみましょう。PHP本家のダウンロードページに、最新版のソースコードをtarでアーカイブしたものを、gzip、bzip2、xzの3種類の方式で圧縮したものがありますので、そのどれかをダウンロードします。Windows用には別にダウンロードページが用意されています。
Gitを使える人は、GitHubから開発中の最新版を取得することもできます。
PHPのソースコードを展開すると、いくつかのディレクトリがあります。このうちPHP処理系のソースコードを含んでいるのは以下の5つです。
- TSRM
- Zend
- ext
- main
- sapi
それぞれについて、簡単に解説します。
- TSRM:スレッドセーフリソースマネージャー。マルチスレッド対応でPHPをビルドする場合に、処理系内部のリソースの扱いに問題が起きないようにするための仕組みです。
- Zend:Zend Engine(ゼンドエンジン)と呼ばれるPHPの処理系の中核部分。Zend EngineはPHPバージョン4向けのPHPの言語エンジンとして開発され、その後バージョンアップを重ねて現在のバージョンは4代目となっています。
- ext:標準でソースコードにバンドルされているPHP拡張モジュールです。
- main:Zend Engineの上で動作するPHP処理系としてのフロント部分です。
- sapi:CGIや各種Webサーバーとの入出力となるServer API部分です。
PHPランタイムとは? ソース構成を知ろう
PHPランタイムはZend Engineと呼ばれる部分と、その上で動作するコマンドラインや各種サーバーAPIとのやり取りを司る部分、また各種機能を実現する「拡張モジュール(エクステンション)」部分から成り立っています。
Zend EngineはPHPのソースコードを読み込み、字句解析し、コンパイルしてOpcode(オペコード)という内部形式に変換し、実際に実行する、PHPとしての処理系本体ともいえる部分です。近年のバージョンでは、JIT(ジャストインタイムコンパイラ)と呼ばれる実行時にOpcodeをネイティブCPUコードに変換したものを保持しておき、実行を高速化する機能も入りはじめています。