「PHP 7」登場。10年ぶりのメジャーバージョンアップで実行速度はPHP 5の2倍以上に、PHPの生みの親が語る。PHPカンファレンス2015(前編)

2015年11月4日

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氏。

fig

2015年6月で、PHPがリリースされて20年になりました。これが1995年6月の最初の発表なのですが、当時のWebにはいろんな問題がありました。それをPHPで解決しようとしたわけです。

fig

スクリプト言語を作ったというよりも、あくまで問題解決をしようとした結果なのです。 簡単にフォームが作れる、そういったものがPHPでした。

私としてはうまくできていると思っていたのですが、当時はだれも気にかけてくれませんでした。

やがて、私が意図したのとは全く違うやり方で使われ始めました。タグの中にすべてのビジネスロジックを書いていく、という使われ方です。

そして20年が過ぎ、たくさんの改善を含むPHP 7が出せるようになりました。実際に世界中で使われているPHPアプリケーションの性能が2倍になるのが主な特長です。

キャッシュの保存と抽象構文木

fig

Persistent Secondary File-based Cacheの採用で、これまで共有メモリにあったキャッシュをディスクにも保存するようにしたため、PHPアプリケーションをリスタートしてもキャッシュの内容がすぐにメモリに展開され、すぐ高速に動くようになります。

fig

リコンパイルの速度は同等ですが、共有メモリに展開するのは10倍速くなり、ディスクからコンパイル済みのコードを持ってくるのと比べても4倍速くなります。

もう1つの新しい機能がAbstract Syntax Tree。抽象構文木。これが私のいちばんのお気に入りです。

各エレメントがシンタックスツリーに入る。このツリーをパースして間違いを探していくようなユーティリティを書くことができます。

下が私が書いてみたスタティックアナライザ。引数が間違っているというのを見つけています。

fig

Return Types、Scalar、Null Coalesce Operatorなど

Return Typesは新機能です。このシンタックスを使うと、関数が特定の型を返すように指定できます。

fig

Scalar型は、数値に対してスカラー型を用いることができます。2つのタイプがあり、Coercive型と強制的に型を適用するStrict Scalar型。

fig

Anonymous Classes。匿名クラスはFunctionやClosureと同じように一回限りで使うクラスを定義できます。

fig

Null Coalesce Operator。これはコードをずっと短い形でかけるもの。

fig

Spaceship Operatorも追加した。ユーザーが比較を行うときに関数を書くが、それを置き換えるのがスペースシップオペレータになる。

fig

これまで致命的エラーになっていたものを例外で置き換えるようにしていて、何かの間違いがあってもコードが止まって致命的エラーを返す代わりに、例外扱いにできる。

fig

Closure::call()の追加。メソッドの上の特定クラスでClosureをコールできる。

新しい予約語

fig

そしてPHP 7ではPHP 4で非推奨になっていたものを除外し、新しい予約語を追加しました。いままでのコードでこういった名前をクラス名につかっていると、コードが動かないことになります。

fig

PHP 5とPHP 7の互換性でややこしいのは、このUniform variable syntaxだと思います。

PHP 7ではすべてが左から右へ読まれていきますが、PHP 5では必ずしもそうではありませんでした。この振る舞いを維持したいときには、カーリープレイス({ })を入れればよいのです。

fig

このような変更を加えることで、前述の抽象構文木が機能するようになったことなど、多くのことができるようになりました。

¥uというユニコードのコードポイントを加えました。

fig

PHP 7の正式リリースは今月末か11月初頭には出せると思っています。

fig

PHP 7、高速化の理由

PHP 7でいかに2倍以上の高速化を実施できたかについて。

まずはWordpressの実行速度から調査していきました。Wordpressのフロントページで100リクエストを実行したときにかかった時間を計りました。

fig

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




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本