2017年12月19日記載
PHP7.2ではPHPExcelもphpspreadsheetへ移行が必要
時代は常に変化している。時代の変化に追従できなければ、取り残されることになる。年齢を重ねると、時代変化を受け入れられなくことが多くなる。過去の成功にしがみつき、新たな知識を吸収することから逃げているだけなのに、過去の繰り返しの回数を「経験がある」と勘違いする人がとても多い。

中途採用市場において、年齢をフィルタにして若い人材を優先的に採用条件としているのは、多くの中高年層は、年齢を重ねてもスキルアップすることなく過去の繰り返し作業の年輪だけ高給取りとなっている人が多いことが主たる理由となっている。年齢とともに新しい知識を積み重ねる挑戦意欲に欠け、時代の変化への追従に乏しいとされる人たちが高齢層には多いのが実態なのは残念である。

前置きはこのぐらいにして、Webの世界では、ビジネス環境を含めて劇的な変化の連続である。ここ数年の動きを思いつくままに列記してみると、こんな感じだ。

・ソフトウエアのクラウド化
・ファイルストレージのクラウド化
・ディスプレイのワイド化に伴うWebデザインの採用
・ホームページ1ページあたりの情報量の増加

これらの変化は、いずれもハードウェアの高度化(マルチスレッド型CPU)とネット回線の高速化、ストレージ単価の下落が背景にある。今やインターネット上に配置されるコンピュータ(サーバ)を操作管理できることがITを制御できると同意といえる。

目の前にある手持ちのPCには、これまでローカル環境に個別でソフトウェアをインストールして使用するのが一般的だったが、現在はWebブラウザとインターネット回線さえ整っていれば、基本的な操作は手元にソフトウェアがなくても大抵のことが操作できる時代になっている。

私自身、これまでプログラミングが苦手で嫌いだったこともあり、過去幾度と挑戦を試みたものの、挫折を繰り返してきた。今も相変わらずプログラミング嫌いは変わらないが、コンピュータ設定にまつわることは昔から好きだったこともあって、アプリは自作できなくてもWebサーバの環境設定程度はすることができていた。

それでも、簡単な動的なページを自作したい願望はずっと持っていた。そんなプログラミング苦手意識の塊の私がブレイクスルーをもたらしてくれたのがPHPの存在である。PHPはプログラミング初心者が最も取っ付き易い言語であることに異論はないと思う。PHPの存在によって今の自分がある。

プログラミング経験値の高い人からみるPHPの存在は、様々な不評意見(PHP dis)が散見されていることは事実である。しかしながら私と同様にプログラミングが苦手だった人たちが、新たにプログラミングの世界に導いてくれる壁の低さとしてPHPの存在は絶大であり、PHPを一定レベルで書けるようになることで、プログラミングすることの楽しさをもたらし、他言語も学びたいと思える動機づけをくれるPHPは、私にとって代えがたい存在である。

PHPは今もなお進化し続けている。まさに時代変化に真っ向から取り組み続けているPHPは将来性も期待できる言語である。不評意見をいうプログラミングのプロたちからみても、PHPは遜色ない速度パフォーマンスを堅持している。Webアプリケーション開発においてPHPとJavaScriptさえマスターできていれば、世の中で作りたいWebアプリならほぼ実装できる言語でもある。

PHP5の時代からPHP7にシフトしてから速度面も遜色ないレベルに到達し、オブジェクト思考対応強化で、多人数による大規模なシステム開発にも対応でき、初心者からプロフェッショナルまで柔軟に対応できる言語として進化スピードは今もそしてこれからも健在である。

PHPはバージョンアップを重ねるたびに、過去の古い機能は遠慮なくバッサリ捨てる勇気と器量を持ち合わせている。つまり、古いPHPで動作できていたものが新しいバージョンになると動作しないことが頻繁に発生する。他言語ではおそらくこれほどまでに過去の機能を捨てる勇気は持ち合わせてないではないだろうか。

もちろん、私のような初級PHPerレベルのソースコードではPHPのバージョンが上がっても影響はほとんどない。過去影響があったケースではPHP5.3からPHP5.4に上がった際、mysql関数群がすべて非推奨になり、変数未定義で大量に発生するWarningとNoticeエラー表示化の対応に苦慮したぐらい。そのPHP5.4の時点で前もってこれらの非推奨関数を使わないようにしておいたことで、メジャーバージョンアップとなったPHP7.0ではソースコードをほとんど修正することなく完全シフトすることもできた。

一方、複雑なソースコードで構成されている外部ライブラリを使用する場合は影響が少なからず発生する。但し開発が継続中のライブラリであれば、待ってさえいればPHP7にも対応してくれるので、ライブラリを最新バージョンに差し替えることでPHP7にも追従することができる。

ところが先月リリースされたPHP7.2では変更点は少ないものの、過去使えた細かい機能が廃止された影響を結構受け、これらの対応に相当量の苦労を強いられたので紹介しておこう。

・PHPExcelからphpspreadsheetへの移行(必須)
・securimageの画像非表示問題の解消
・PHP7.2推奨するzlibからlibzip変更によるtcpdfへの影響

主に3点だった。いずれの対応にも苦慮したが、最も苦しんだのがPHPExcelの後継版へのシフト作業である。PHPExcelはバージョン1.8を最後に事実上サポートは終了している古いライブラリだ。PHP7.0に移行した際も一部動作しなかったが、私のレベルで数カ所の文字列を消す対応でなんとか継続利用することができた。しかしPHP7.2では完全にアウト。count()関数の未定義の値を入れた場合にWarningが出る仕様変更に伴い、PHP7.2でPHPExcelを動かすことは不可能となってしまった。

PHP7.2でPHPExcelを動かすための方法をググっても、英語の解説文章を読む限り、「PHPExcelではなくphpspreadsheetを使え」と書いてあった。従ってPHP7.2でPHPExcelの利用は諦めるしなく、素直に後継バージョンとされるphpspreadsheetへの移行を余儀なくされることとなった。

現時点において、Web検索からphpspreadsheetの使い方についての日本語サイトはごくわずかしか見つからなかった。数少ない日本語解説サイトも大半は公式サイトのサンプルを動作させるまでの紹介で終わっているページが多く、自分がやりたい動作(セルのスタイル設定等)をさせるための書き方を説明したWebサイトは見つからなかった。

phpspreadsheetを使うためにライブラリ入手するにはcomposerでインストールした場合のみの解説ばかりだった。つまりcomposerの仕組みを理解しないとphpspreadsheetすらセットアップできないことというわけである。composerって何?とイライラしながらも今度はcomposerについて新たにマスターすることになった。

Linuxでcomposerを使おうと試みると、今度はphpからhttpsサイトにアクセスできない問題に遭遇。composerをwebからダウンロードしてインストールするため、phpを「--with-openssl」で再コンパイルする羽目に陥った。無事クリアしたと思ったら今度は次にcomposer.jsonファイルについて覚えなければならない。そしてまたググる。PHPExcelに変わるライブラリの使える環境整備だけで、どんどんドツボにハマっていく。

securimageの画像非表示問題では、PHPで動かすためにはGDが必須なのだがGDにもオプションでpngとjpegだけでなくfreetype2もインストールしなければならない。このfreetype2を最新バージョンに適合させることができず3日ほど時間を要してしまった。

PHP7.2ではzlibだけconfigureオプションでコンパイルすると、zlibよりlibzipを推奨すると表示される。そこでzlibの代わりにlibzipだけ入れて再コンパイルをした。すると今度はtcpdf+fpdiが動かない状況に陥った。結局PHPからPDFを使うにはzlibもlibzipも両方インストールしなければならなかった。

参考までに私のPHP7.2をソースコードからのインストール場合に設定しているconfigureオプションを紹介しておこう。

(PHP7.2 for CentOS7.4)
./configure --enable-zip --with-gettext --enable-bcmath --enable-sockets --with-curl --with-bz2 --enable-calendar --enable-inline-optimization --with-pcre-regex --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-mbregex --with-libxml-dir=/usr/local --with-gd=/usr/local --with-zlib=/usr/local --with-libzip=/usr/local --with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-freetype-dir=/usr/local --with-webp-dir=/usr/local --with-iconv-dir=/usr/local --with-xpm-dir=/usr --with-openssl=/usr/local/ssl --with-mysqli --with-pdo-mysql --with-mysql-sock=/tmp/mysql.sock

事前に
yum install xorg-x11-proto-devel libXpm-devel.x86_64 libX11-devel pam-devel
の実行と、

opensslのソースコードからのインストール
./config -fPIC shared

jpeg、tiff、freetype、libpng、libwebp
のソースコードからのインストール

jpegsrcは./configure --enable-shared
libpngは./configure --prefix=/usr/local LDFLAGS="-L/usr/local/lib -lz"
その他は./configureのみでOK。

libgdのソースコードからのインストール
./configure --with-png=/usr/local --with-freetype=/usr/local --with-jpeg=/usr/local --with-xpm=/usr --with-libiconv-prefix=/usr/local --with-webp=/usr/local -disable-werror

curlのソースコードからのインストール
CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib"
./configure --enable-http --enable-ftp --enable-file --enable-proxy --enable-cookies --with-zlib=/usr/local --with-ssl=/usr/local/ssl --with-libssh2=/usr/local

そして、libzip、zlib、m4、autoconf、libiconv、libxml及びmysqlをソースコードからインストールが完了していることが先のPHP7.2の条件configureオプションの動作条件となるので注意してほしい。

こうしてPHP7.2への移行はかなり苦しむ結果となった。だが、結果的にcomposerインストールについて理解できたし、PHPのコンパイルのオプションについても、これまでなんとなくWebで書かれている内容をそのままコピペして実行していたオプションの内容が意味まで理解できるようにもなった。

PHPは来年末に向けてPHP7.3の開発が始まったそうだ。HVMMで採用されているJITコンパイルの採用も予定されているらしい。PHPが時代遅れという人が今もいる。実態は今もなお最先端を突っ走る素晴らしいWebアプリケーション言語である。

時代は変化し続けている。最新バージョンで動かなくても過去バージョンなら動くから、そのまま使い続ければ良い、と逃げることはしない。せっかく最新バージョンがあるのだから、頑張って適合させるように努力するべきである。私はこれからも逃げずに最新の潮流に乗り続けていくつもりだ。


コラムワード検索
表示件数
ワード検索
本コラムに関する意見
Twitterにて受け付けます @megahit_jp