はじめに
PHP Advent Calendar 2020 の17日目を担当します平田です。よろしくおねがいします。
最後にQiitaの記事をまともに書いてから、気づけば3年半が経っていました。光陰矢の如しとはこのことです。
しかし、それ以上に驚いたことがあります。それは、PHP4のリリースから20年が経ったということです。
主流だったPerlを押しのけて、バックエンド開発言語の頂点を目指したPHP4。
ZendEngineの搭載によりPHPのパフォーマンス改善ロードの端緒を開いたPHP4。
私をWebエンジニアの道に導いたPHP4。
そんな伝説のPHP4時代のエンジニアがPHP8のリリースされた現代にきたら、どうなるのでしょうか?
今回はPHP8のリリースに心を踊らせている私のもとに、PHP4.0のリリースに心を踊らせていたAさんが突然現れました。
時代の違い
Aさん「あれ?ここは・・・?」
私「2020年12月です。」
Aさん「えっ、20年後!?なんで!?」
私「理由はわかりませんが、あなたに朗報があります。つい先週、PHP8.0がリリースされました」
Aさん「8.0!?ついこの間4.0が出たのに!」
※ PHP4.0のリリースは2000年5月22日です。
私「そうです。そして20年が経ち、メジャーバージョンは4つも上がりました。」
Aさん「何ということだ。・・・というか、20年間も続いてくれたんだな、PHPは。」
※ 2000年頃はまだまだPHPも駆け出しの言語で、ベテラン勢からは「Perlの劣化版」なんて見下された記憶もあります。
私「今や、Web開発言語では押しも押されもせぬ存在ですよ。」
Aさん「それはすごい。どれほど変わったのか、ぜひ聞かせてくれないか。」
私「ぜひとも。」
オブジェクト指向の進化
Aさん「PHPのオブジェクト指向は、まだまだ使い物にならないんだよな・・・」
私「そうですね。PHP4だと名前空間やクラス内定数もないですしね」
※ 名前空間・クラス内定数(const指定)・統一コンストラクタ(__construct())・アクセサはPHP5で実装されました。
私「今でこそ当たり前のクラスの抽象化も、PHP5以降でようやく実装されましたね」
Aさん「もしかして、Abstractが使えるようになったのか?」
私「Interfaceにimplementすることもできますよ」
Aさん「Interface」
※ AbstractもInterfaceもPHP5で実装されました。
私「今はクラスの書き方はJavaとほぼ同じで、機能的にも殆ど同じです。そのせいもあって、今やアプリケーションをDDDで書く変態がPHPでもザラにいますね」
Aさん「DDD」
※ PHP7以降はクラスの抽象化やタイプヒンティングが更に便利になったので、高度なクラス設計が可能になりました。
※ LaravelやCakePHP3でDDDを使うのが今や当たり前?ですが、そもそもエリック・エヴァンスの「ドメイン駆動設計」が2003年発売です。
ZendEngine
Aさん「ところで、まだZendEngineはあるのか?」
私「あります。PHP8ではZendEngine4が搭載されています」
Aさん「これだけ進化したのに、まだZendEngineはZendEngineなんだな・・・」
※ PHP4で初めて搭載されたZendEngineは、PHP8でも第4世代のZendEngine4となって搭載されています。
※ 正直、ZendEngineは軽量化しつつ機能を増やしているだけで、基幹部分はさほど進化していません。
私「ZendEngineに無駄な手を加えず、キャッシュを使って高速化を図る路線になって久しいですね」
Aさん「インメモリキャッシュ?あのポンコツAPCのこと?」
※ PHP4時代からAPCはありましたが、性能の割に脆弱性がひどく、PHP5.2で安定するくらいまでは厄介者扱いでした。
私「PHP5.5からはZendが作ったOPCacheという高性能なコードキャッシュができました。」
※ PHP5.5からZend OPCacheが標準で利用できるようになり、追ってZendOPCachePlusという拡張機能でPHP5.3/5.4でも利用できるようになりました。
私「PHP7.0以降はZendEngineの軽量化も相まって、OPCacheなしでも目に見えて高速化しましたね」
Aさん「そんなに早くなったのか」
私「PHP7.0+OPCacheとPHP5.3+APCでミドルウェアだけ入れ替えてMySQLのSELECTをするだけのページに対してApacheBenchを回したら、1秒間にさばけるリクエスト数が3倍程度になりました」
Aさん「3倍」
※ ちなみに、APCを入れていないPHP5.3と比較すると、その差は10倍まで開きました。
私「私はまだ試していませんが、PHP8からはJITでの実行になって、更に高速化しているみたいですよ」
Aさん「JIT?Java?」
※ かつてJavaの専売特許みたいなものだったJITが遅ればせながらPHP8で採用され、最適化コード(OPCode)からJITコンパイルをすることで実行の高速化が実現しました。
HHVM / Hack
私「JITといえば、HHVMですね。」
Aさん「なんですそれ?」
※ HHVM / HackはFacebookが作ったPHP派生の開発言語とコンパイラで、2014年頃までにFacebookはHackに置き換えられたそうです。
私「FacebookがPHPをベースに作ったVM形式のPHP用JITコンパイラですね。PHP8のJITはそれから6年くらい後に出ました」
Aさん「Facebook?本屋?」
私「SNSですよ」
Aさん「SNS?」
※ Facebookは2004年にサービス開始です。日本でSNSがブームになり始めたのも2004年頃からで、Greeやmixiも2004年サービス開始です。
※ 余談ですが、日本で「SNS」という単語が一般的になったのは、大ブームになったmixiやFacebookがリリースされた2004年頃以降と思われます。少なくとも、2000年頃にSNSという単語は聞いたことがありませんでした。
私「PHPとHackのように、フォークされた言語が独り立ちしていくのってなんか感動しますよね。PHPも一人前になったんだなぁって感じがします」
Aさん「CとC++みたいなのか」
私「古い」
※ Hackの情報が出てきたのは2014年頃、C++の初期リリースは1983年です。
フレームワーク
私「PHP5が出るまでは、PHPのオープンソースフレームワークが少なかったですよね」
Aさん「フレームワーク?MFCみたいなやつか?」
私「草」
※ Webフレームワークが一般化したのは2001年のSmartyやApacheStrutsのリリース頃からで、日本語化対応の進んでいるものがゴリゴリ出始めたのは2004年のRuby on Railsリリースの頃以降だったと思います。
※ PHPのフレームワークの発達は、オブジェクト指向に関する機能の未熟さやHTML内へ直接プログラムを書き込める柔軟性から、他言語に比べて若干遅れてスタートしました。しかし、PHP5のリリース以降、機能向上と高速化が進むにつれて数多くのMVCフレームワークが生まれました。
エピローグ
私「20年。変わったものもあれば、変わらなかったものもありましたね。」
Aさん「頑張って勉強したPHPが残っていてくれて、それだけでも嬉しかったよ」
私「あれ、体が透けて・・・?」
Aさん「どうやらお別れの時間みたいだ。20年後に、また会えるといいな」
そう言ったAさんの体は、音もなく消えていきました。
???「私くん、誰と話していたんだ?」
振り返ると、CTOのAさんが立っていました。
私「いえ、ちょっと独り言です」
Aさん(今)「そうか。疲れが溜まってるんじゃないのか?今日は帰っていいぞ」
私「大丈夫です」
私「自分、PHP大好きっすから」
完