2020年12月02日記載
PHP8.0.0正式版リリース、本サーバもアップデート完了
今日はWebアプリケーション開発言語PHPがPHP8.0.0をリリースについて取り上げます。テクニカルな話題のため、興味のない方は読み飛ばしをお願いします。

待望?のPHP8の正式版がリリースされた。PHP7以来のメジャーバージョンアップである。目玉はJITの搭載。簡単に表現すれば、テキストコードから適時処理を行うPHP7からバイナリベースの処理に置き換えて処理するJITによって超高速動作環境を手にしたのがPHP8というわけである。

超高速といっても、普通のWebアプリ程度の使い方であれば、速度の向上を体感するようなことはまったくない。なぜならインタプリタ型言語でありながらPHP7は相当早い処理速度を演じており、Webページを表示させる通常の処理レベルなら、どちらも瞬間的に処理が終わってしまう。だから体感的な差は見いだせない、という意味である。

PHP7とPHP8の差を実感するとすれば、膨大なループ処理を実行するような環境で差が出ると思われる。たとえばfor文で1億回程度の処理を複数束ねて実行させるようなプログラムを組むレベルだと体感的な差が出てくると思われる。

通常のWebアプリで動かすレベルのループ処理はせいぜい1000回程度のfor文が数箇所出てくるレベルで済んでいる。この程度の処理ならPHP7なら瞬間的に処理をこなしてしまうので、PHP8にしても体感的な差は見いだせない思われる。

実際、自分がWebアプリを作る上で動作遅延になりうるボトルネックはPHP処理ではなくSQLによる応答待ちの影響度のほうが大きい。

CSVファイルを使って一気に大量のデータをインポートするような場合、処理待ち時間はPHPではなくSQL待ちによってユーザを待たせてしまう。

だからWebアプリ全体の最適化を考えるには、PHPの速度向上領域ではなく、如何にしてSQL側の処理を早めるように記述するかのほうが重要というわけである。

大量のデータINSERT文を実行するなら、必ずバルクインサート処理を使うとか、SELECT文を大量に突っ込むような書き方をしているなら、クエリを飛ばす回数を減らして、1回のSELECTクエリで、PHPの連想配列に必要なデータをまとめて取り込んでから、PHPだけでデータを抽出するような書き方に変更する。

これによりWebアプリ全体の処理時間短縮を図ることができるようになる。Webアプリの速度改善はSQLクエリを飛ばす回数を減らすことを意識するだけでいい。すでにPHPの内部処理速度はCPU依存レベルまで最適化されているからだ。

この考え方は、パソコンの体感処理速度を重要視して購入をチョイスする場合、CPUのスペックよりもHDDをSSDに交換する方が圧倒的に効果が高いのと全く同じ理屈である。

PCを見てCPUのスペックを最重要視してチェックする人が多い。私の経験上、第2世代のCorei7のSSDパソコンと、第8世代Corei5のHDDと比べると、未だに第2世代PCのほうがトータル速度で勝っているのである。

それだけ今のWindows10は初期起動に膨大なデータをメモリに常駐させるプロセスが組み込まれている。

話は若干逸れたが、CPUはPHPでありHDDがSQLと読み替えればいい。PHP8になり、もはや処理速度向上性能面において限界レベルに達したバージョンに到達した。PHPはインタプリタ型言語だから遅い、そんな時代は完全に終わった。PHPは猛烈に処理速度の速い開発言語へ進化したのである。

ちなみに本サーバも昨晩PHP8にアップデートを完了した。PHP7からPHP8へのアップデートで既存プログラムに影響を与えた箇所は今のところ見当たっていない。

PHP7.2からPHP7.3にバージョンアップしたときのようなインパクトは皆無である。PHP7.3でエラーゼロなら、よほど特殊な関数を使っていない限り、問題なくPHP8へ切り替えしても問題ないのではないだろうか。

なお、phpMyAdmin 5.0.4では、エクスポートの画面のみエラーが発出されている。phpMyAdminを多用されている方はPHP8へのアップデートはphpMyAdminが対応完了するまで待ったほうが良いのかもしれない。

php.iniファイルもPHP7.4からほぼ変更がなかった。私がざっと見た限り、一箇所だけ新しい設定箇所を発見したものの、PHP7.4の設定機能はそのまま踏襲できると思われる。

WebサーバにApacheを使っている方は、httpd.confファイルの設定に注意したい。

◆PHP7.4
LoadModule php7_module modules/libphp.so
AddHandler php7-script .html .php

◆PHP8.0
LoadModule php_module modules/libphp.so
AddHandler php-script .html .php

いずれも7の部分を消さないとエラーになるので注意してほしい。

一方、ソースコードからのインストールでは、PHP7で有効だったconfigureオプションで

--enable-inline-optimization

がWarning扱いになっている。内容を見ればPHP8では全く必要のない指定なので納得がいく。PHP8ではここだけ消しておけば、configureは普通に通過した。PHP7.2から7.3にした時のような苦労はまったくなかった。

さあ、みなさんもPHP8の世界にためらわずに移行してみてはいかがだろうか。
コラムワード検索
表示件数
ワード検索
本コラムに関する意見
Twitterにて受け付けます @megahit_jp