PHPカンファレンス2015 スペシャルレポート

PHPカンファレンス2015 当日レポート[更新終了]

この記事を読むのに必要な時間:およそ 27.5 分

中村けん牛さん「超高速WordPress ~PHP7 vs HHVM vs PHP5.6」

プライム・ストラテジー株式会社 代表取締役の中村けん牛さんは,WordPress高速化の技術と考え方をPHP7, HHVM, PHP5.6のベンチマーク付きで解説しました。

画像

中村さんは『詳解WordPress』などの本の執筆やWordPressプラグインの開発,Webメディアで連載記事を執筆するなど,活動は多岐に渡ります。また,プライム・ストラテジーでは1億PV/月超えのメディアサイトなどの構築,サーバ運用をしており,他にもWordPress仮想マシンイメージKUSANAGIを開発しています。

最初にKUSANAGIのサイトを取り上げ,ページ右上に記載されている「Run time 0.005s」とはサーバでWordPressを実行している時間であると言及。ページキャッシュを使わずにこの実行時間を実現していて,現状50~01,000msが普通ですが,KUSANAGIは100倍の速度をたたき出していると説明しました。

なぜ高速化が必要なのか?

そして,高速化の必要性について話していきました。理由としては第一に,PHP+MySQLの動的なシステムなので,静的なHTMLページに比べると動作速度の点で不利になること。第二に,CPUの開発ロードマップは動作クロック(周波数)よりもコア数を重視していることを挙げました。後者については,同時処理能力は向上していますが,ほとんどの処理が直列実行であり,直列の限界が周波数の値になるため頭打ちになること。そのため,ハードの進化による処理速度向上を期待しづらくなると述べていました。

また,オウンドメディアやサービスサイトでは,次の観点から高速化が必要になると指摘しました。

  • PV獲得の機会を失わない
  • UXを向上
  • 検索エンジンを最適化
  • Webサイトの信頼性,安定性を向上

画像

サーバサイドの高速化とは?

WordPressの高速化はサーバサイド(サーバ,WordPress)での高速化とフロントエンド(HTML, CSS, JS)での高速化に分けられますが,今回はサーバサイド側の話を続けました。

サーバサイドで高速化するためには,HTMLページのロード時間を短くして,1秒あたりのリクエスト(アクセス)数を増やすことだと言及。ここで言うHTMLページのロード時間は,HTTPリクエスト送信,WordPress実行,それとHTTPレスポンス受信までの時間の合計になるとし,これを短くすることを目指すことだとしました。なお,ロード時間はFirefoxのFirebugのネットタブで確認できます。

ページのロード時間と1秒あたりのリクエスト数の関係

1コアでページのロード時間が500msだった場合,1秒あたりのリクエスト数は2。100msにチューニングできたときは10。2コアにスケールアップすると20。さらに4コアにスケールアップするとロード時間は変わらず100msになります。

また,リクエスト送信と受信には通信時間,WordPressでのPHPの実行,MySQLの実行,翻訳処理の時間が含まれます。特に翻訳に時間がかかるため,日本語と英語版のWordPressでも倍くらい時間が違います。

ページキャッシュを使わずにWordPressを高速化する

LAMP(PHP5.4)にWordPress4.3日本語版を入れた環境を用意して,ページのロード時間を計測した結果,この時点でロード時間は246ms,リクエスト数は4.9リクエスト/秒だったとのこと。そしてAPC(PHPアクセラレータ)を導入すると,246msから133msと約1.85倍早くなったことを示しました。

このAPCは簡単に導入できるとし,CentOS6の場合はroot権限で次のコマンドを実行すればよいと説明しました。

yum install -y php-pecl-apc
service httpd restart

PHPアクセラレータはPHP5.5以降はOPcacheを使います。PHP5.6とOPcacheの組み合わせで,246msから110msと約2.2倍の速度になると指摘しました。

この状態でさらにMySQLのクエリキャッシュを導入すると,110msから102msと約1.1倍の速度に。なお,MySQLのクエリキャッシュはデフォルトのWordPressで導入されているため,基本,設定は不要だと述べました。ちなみに設定する場合には,query_cache_size = 64Mをmy.cnfのmysqldセクションに記述し,MySQLサーバをrestartすればよいと説明しました。

さらに翻訳キャッシュを導入することで,102msから72msと約1.4倍の速度になること。そして,PHP7RC4とOPcacheの組み合わせで約2倍になり,72msから36msになること。最後にHHVM3.9導入で30msまで高速化することを紹介しました。

ここで発表の時間切れとなりましたが,WordPressの高速化について,実例を挙げながらとてもわかりやすい説明をされていて,勉強になる発表でした。

寺田渉さん「PHPの基本クイズ ? この動き,あなたは知っていますか?」

プログラムと翻訳が趣味だという寺田渉さんの発表は,PHPでハマりそうなポイントをクイズ形式で紹介しました。

画像

画像

クイズは,PHPの他の言語にはない仕様を題材にしたもので,20の問題が出題されていきました。その一部の内容を紹介します。

  • ==ではなく===の必要性。
  • switchも==で比較していること。
  • number_format関数は,引数にfloatを受け取るため,大きい値を引数に渡すと丸められてしまうこと。
  • empty関数に文字列の'0'を渡すとtrueを返すこと。
  • if ($var)とif (!empty($var))の動作の違いについて。前者の書き方だと$varが未定義時にNoticeがでてしまうこと。
  • PHPのみのファイルで,?>の後ろに空白があるとhttpヘッダは出力済になるためリダイレクト等はできず,代わりに真っ白の画面が表示されてしまうこと。
  • 次のコードにおける,配列の+とarray_merge()の違い。
 var_export($a + $b);
 var_export(array_merge($a, $b));
  • foreachで書き換えたら異変が起こること。書き換えならarray_walkを使おうと説明。
$array1 = [1,2];
foreach ($array1 as &$val) {
      $val = 0; //0で書き換え
}
$array2 = [3,4];
foreach ($array2 as $val) {
      //何か
}
var_export($array1); // [0, 4] なぜ 4 ここに!?
var_export($array2); // [3, 4]

著者プロフィール

大橋勇希(おおはしゆうき)

東京都渋谷区在住。Webアプリケーションエンジニアで,主な使用言語はPHP。最近は,TDD(テスト駆動開発)やDDD(ドメイン駆動設計)に取り組みエッセンスを吸収している。

Twitter:@secret_hamuhamu URLhttp://hamuhamu.hatenablog.jp/


柏原幸治(かしわばらこうじ)

東京都豊島区在住。仕事はブラウザーゲームのバックエンドをPHPで開発している。他の言語もいろいろいじるが,一番長く使ってるPHPが一番使いやすい。

Twitter:@noah0x00
Facebook:https://www.facebook.com/koji.kashiwabara


菅原のびすけ(すがわらのびすけ)

株式会社LIG エンジニア。1989年生まれ。岩手県立大学在籍時にITベンチャー企業の役員を務める。同大学院を卒業後,株式会社LIGにWebエンジニアとして入社し,Web制作に携わる。最近は特にIoT領域,インタラクティブな企画実装などに従事している。

マッシュアップアワードを始めとしたハッカソン等で入賞歴あり。家賃0円クリエイターズシェアハウス第1期生。ジーズアカデミー第1期メンター。LIGinc,HTML5Experts.jp,さくらのナレッジ,gihyo.jpなどでも執筆・寄稿をしている。Milkcocoaエバンジェリスト,特技はわんこそば,趣味は雪合戦。

Twitter:@n0bisuke

LIGincプロフィール:http://liginc.co.jp/member/member_detail?user=nobisuke


中村慎吾(なかむらしんご)

仕事でPHPを使うようになって10数年。楽しい事には何でもやってみるスタイル。趣味が講じて(拗らせて?)会社も作りました。Web開発となるとPHPは手放せません。

Twitter:@n416
URLhttp://kisaragi-system.co.jp


仁多見遼(にたみりょう)

岩手県立大学大学院 ソフトウェア情報学研究科 2年。主にAndroidアプリ開発をしているが,2016年4月から東京でWebエンジニアとして働くことになり,PHPやJavaScriptを書き始めた。いろんなイベントに参加したり,自身でハッカソンを主催するなどイベントが大好きな人。

Twitter:@bird_nitryn
URLhttp://rnita.me

バックナンバー

PHPカンファレンス2015 スペシャルレポート