「PHP 7」登場。10年ぶりのメジャーバージョンアップで実行速度はPHP 5の2倍以上に、PHPの生みの親が語る。PHPカンファレンス2015(前編)
WordpressやFacebookなど、Webのさまざまなサービスで使われているPHP言語。約10年ぶりのメジャーバージョンアップとなる「PHP 7」がもうすぐ登場予定です。
PHP 7では互換性を維持しつつ、従来のPHP 5と比べて2倍以上の性能向上やメモリ使用量を低減するなど、大きな改善が実現されます。
そのPHPの生みの親であるRasmus Lerdorf氏が来日し、10月3日に都内で行われた「PHPカンファレンス2015」の基調講演「SPEEDING UP THE WEB WITH PHP 7」においてPHP7の新機能や性能について詳しく解説しました。
その内容をダイジェストで紹介しましょう。
SPEEDING UP THE WEB WITH PHP 7
PHPの生みの親、Rasmus Lerdorf氏。
2015年6月で、PHPがリリースされて20年になりました。これが1995年6月の最初の発表なのですが、当時のWebにはいろんな問題がありました。それをPHPで解決しようとしたわけです。
スクリプト言語を作ったというよりも、あくまで問題解決をしようとした結果なのです。 簡単にフォームが作れる、そういったものがPHPでした。
私としてはうまくできていると思っていたのですが、当時はだれも気にかけてくれませんでした。
やがて、私が意図したのとは全く違うやり方で使われ始めました。タグの中にすべてのビジネスロジックを書いていく、という使われ方です。
そして20年が過ぎ、たくさんの改善を含むPHP 7が出せるようになりました。実際に世界中で使われているPHPアプリケーションの性能が2倍になるのが主な特長です。
キャッシュの保存と抽象構文木
Persistent Secondary File-based Cacheの採用で、これまで共有メモリにあったキャッシュをディスクにも保存するようにしたため、PHPアプリケーションをリスタートしてもキャッシュの内容がすぐにメモリに展開され、すぐ高速に動くようになります。
リコンパイルの速度は同等ですが、共有メモリに展開するのは10倍速くなり、ディスクからコンパイル済みのコードを持ってくるのと比べても4倍速くなります。
もう1つの新しい機能がAbstract Syntax Tree。抽象構文木。これが私のいちばんのお気に入りです。
各エレメントがシンタックスツリーに入る。このツリーをパースして間違いを探していくようなユーティリティを書くことができます。
下が私が書いてみたスタティックアナライザ。引数が間違っているというのを見つけています。
Return Types、Scalar、Null Coalesce Operatorなど
Return Typesは新機能です。このシンタックスを使うと、関数が特定の型を返すように指定できます。
Scalar型は、数値に対してスカラー型を用いることができます。2つのタイプがあり、Coercive型と強制的に型を適用するStrict Scalar型。
Anonymous Classes。匿名クラスはFunctionやClosureと同じように一回限りで使うクラスを定義できます。
Null Coalesce Operator。これはコードをずっと短い形でかけるもの。
Spaceship Operatorも追加した。ユーザーが比較を行うときに関数を書くが、それを置き換えるのがスペースシップオペレータになる。
これまで致命的エラーになっていたものを例外で置き換えるようにしていて、何かの間違いがあってもコードが止まって致命的エラーを返す代わりに、例外扱いにできる。
Closure::call()の追加。メソッドの上の特定クラスでClosureをコールできる。
新しい予約語
そしてPHP 7ではPHP 4で非推奨になっていたものを除外し、新しい予約語を追加しました。いままでのコードでこういった名前をクラス名につかっていると、コードが動かないことになります。
PHP 5とPHP 7の互換性でややこしいのは、このUniform variable syntaxだと思います。
PHP 7ではすべてが左から右へ読まれていきますが、PHP 5では必ずしもそうではありませんでした。この振る舞いを維持したいときには、カーリープレイス({ })を入れればよいのです。
このような変更を加えることで、前述の抽象構文木が機能するようになったことなど、多くのことができるようになりました。
¥uというユニコードのコードポイントを加えました。
PHP 7の正式リリースは今月末か11月初頭には出せると思っています。
PHP 7、高速化の理由
PHP 7でいかに2倍以上の高速化を実施できたかについて。
まずはWordpressの実行速度から調査していきました。Wordpressのフロントページで100リクエストを実行したときにかかった時間を計りました。
2014年の1月から12月までの1年間の改善を見ていくと、時間は半分に、命令数は3分の1になっています。
20年前からあるコードベースでこうした改善をするのは容易ではありませんでした。基本的に命令の3分の2を捨て去り、それでもこれまでと同じように動くことが求められたのです。
どうやったのかといえば、PHPのあらゆるところでメモリの使用量を下げていきました。それ以外にも速度の向上のためにCPUキャッシュやコンパイラなど、できることをたくさん検討しました。
PHP 7にはJIT(Just in Time Compiler)はありませんが、これは逆にいい話です。JITを使わずにこれだけの改善ができたのですから。コードのホットスポットをさらに改善する余地としてJITという選択肢が残されているわけで、より一層の改善が望めると言うことです。
≫後編に続きます。後編ではWordpress、DrupalなどさまざまなPHPアプリケーションのベンチマークでPHP 7の実行速度が確かに高速になっていることが確認されます。
参考:PHP 5からPHP 7への移行で、Tumblrはレイテンシが半分、CPU負荷も半減。テストツールでPHP 7への移行に問題ないかをチェック
参考:「PHP 7」正式版が登場。PHPにとって10年ぶりのメジャーバージョンアップ。実行速度は旧バージョンの2倍以上
あわせて読みたい
「PHP 7」登場。10年ぶりのメジャーバージョンアップで実行速度はPHP 5の2倍以上に、PHPの生みの親が語る。PHPカンファレンス2015(後編)
≪前の記事
2018年までに300万人以上の労働者の上司がロボットになり、2020年末までにクラウドにおけるセキュリティ障害の95%は顧客が原因に。Gartner Predicts 2016