サイトリニューアルの作業中に不思議なことが有ったので忘れないウチにメモ。
リニューアル前からブログのトップページには画像と表題を組み合わせた9区画の見出しを配置していますが、その処理にはPHPの画像処理関数を使っています。
いわゆる GDライブラリ ってヤツですが、PHPをインストールした時にGD関連の関数も使えるように必ず php.ini を編集しています。
PHP 7.1.20 のインストール記事でも書いていますが、ローカル環境でもGDは【有効】になっているハズでした。
;extension=php_gd2.dll
…が、編集作業中の画面キャプチャを取る際に、うっかり『 ; 』を外し忘れたようで、リニューアル作業中もGDライブラリが【無効】の状態になっていました。
不思議なのはGDが無効であるにも関わらず、ブログトップページの画像処理はエラーも出ずに実行されていた点です。実際、9区画の表示もなされていたのでローカル環境でGDが無効なのにも気付かずにいました。
9区画の処理は、imagecreatefromjpeg と imagecreatetruecolor を始めとして imagecopy や imagejpeg などのメジャーな(?)関数を使っていますが、GDが無効の状態であれば Fatal error が出て処理が中断されるハズです。
GDが無効となっているのに処理が行われていた事実に気づいた時は、赤木博士の言葉を借りるなら 『そんな…動くはずないわ!まだエントリープラグ…』 という状態であり、『左腕復元か?』と、しょーもない事を考えて(ry
ちなみに PHP 7.3.x の php.ini には
;extension=gd2
…と、PHP_ や .dll の拡張子が省略されている…とメモっておく。
GD ライブラリが無効でもOKなの?
ただ、GDライブラリが無効な状態で全く問題が出なかったワケではなく、ページ送り(ページャー)で 14ページまで指定するのはOKだけど 15ページ以降を指定すると Fatal error が出て処理が止まるという状態でした。
エラーの再現性が100%でありながら原因の特定に時間が掛かってしまったのは、動いたり、動かなかったりしたのが一番の要因で、GDが無効になっているとは思いもよらず…ヽ(´o`;
下記がそのエラーメッセージです。(一部改行)
Fatal error: Uncaught Error: Call to undefined function imagecreatefromjpeg()
in C:\svs\Apache\htdocs\roomx\roomb\wp-content\themes\twentyten\index.php:115
Stack trace:
#0 C:\svs\Apache\htdocs\roomx\roomb\wp-includes\template-loader.php(98): include()
#1 C:\svs\Apache\htdocs\roomx\roomb\wp-blog-header.php(19): require_once('C:\\svs\\Apache\\h...')
#2 C:\svs\Apache\htdocs\roomx\roomb\index.php(17): require('C:\\svs\\Apache\\h...')
#3 {main} thrown in C:\svs\Apache\htdocs\roomx\roomb\wp-content\themes\twentyten\index.php on line 115
サイトに重大なエラーがありました。
WordPress でのデバッグをさらに詳しく見る。
エラーメッセージには 「index.php 内の 115行目、imagecreatefromjpeg() が無効…云々」 とありますが、前述の通り 14ページ目までは正常に処理されていたのでエラーメッセージの意味が理解できませんでした。
…で、散々調べてもエラーの原因が特定できず、最後の最後に改めて php.ini を再確認したらGDが無効となっていた…というワケです。
Windows OS で PHP を動作させる際の GDライブラリ(拡張モジュール)の実体ファイルは、php_gd2.dll ですが、この仕様に関して調べてみてもイマイチ情報が少なく、無効な状態でも何故に処理が行われていたのか不明なままであります。
1ページあたり9枚の画像で14ページでは 9 x 14 = 126枚、WordPress がフロントエンドだと128枚までは GD がなくても処理…とか、そんなワケはないか…。
結局、モヤモヤ感は拭えずにいますが、PHPでの画像処理が動作したり、しなかったりした時のチェック項目の一つとして記録しておきます。
+++
ちなみに WordPress上でエラー表示させるか否かは wp-config.php の一行を…
define( 'WP_DEBUG', false );
から…
define( 'WP_DEBUG', true );
に編集しておくだけです。(ローカル環境でテスト、サイト構築する時は、デバッグの手掛かりとなるので便利)