PHP 8系に移行できるだろうか?(8)
SIGBUS回避してPHP 8.0.27に移行完了!
JITコンパイラが無効なのにもかかわらずコンパイルしたファイル名をエラーメッセージに埋め込もうとして異常終了する不具合(バグ)があるのではないか?というのが前回までのお話。この仮定が正しいかどうか?"zend/zend.c" を修正して SIGBUSを回避できるか試してみました。
"zend/zend.c" 内の get_filename_lineno() 関数を以下のように修正してみます。
static ZEND_COLD void get_filename_lineno(int type, const char **filename, uint32_t *lineno) {
/* Obtain relevant filename and lineno */
switch (type) {
case E_CORE_ERROR:
case E_CORE_WARNING:
*filename = NULL;
*lineno = 0;
break;
case E_PARSE:
case E_COMPILE_ERROR:
case E_COMPILE_WARNING:
case E_ERROR:
case E_NOTICE:
case E_STRICT:
case E_DEPRECATED:
case E_WARNING:
case E_USER_ERROR:
case E_USER_WARNING:
case E_USER_NOTICE:
case E_USER_DEPRECATED:
case E_RECOVERABLE_ERROR:
if (zend_is_compiling()) {
#if defined(HAVE_JIT)
*filename = ZSTR_VAL(zend_get_compiled_filename());
*lineno = zend_get_compiled_lineno();
#else
*filename = NULL;
*lineno = 0;
#endif
} else if (zend_is_executing()) {
*filename = zend_get_executed_filename();
if ((*filename)[0] == '[') { /* [no active file] */
*filename = NULL;
*lineno = 0;
} else {
*lineno = zend_get_executed_lineno();
}
} else {
*filename = NULL;
*lineno = 0;
}
break;
default:
*filename = NULL;
*lineno = 0;
break;
}
if (!*filename) {
*filename = "Unknown";
}
}
|
JITコンパイラ機能が組み込まれていない(HAVE_JIT が undefined)なら、コンパイルしたファイル名には NULL を返すようにしています。かなり場当たり的で筋が悪い修正な気もしますが、これで SIGBUSが治るようなら仮定は正しいと言えるのでは?
試したところ、SIGBUS はピタッと起きなくなりました。その代わりに以下のようなエラーメッセージがエラーログファイルに沢山出力されるようになりました。
[Thu Feb 09 19:14:23.959578 2023] [php:warn] [pid 18605:tid 26285568] [client 46.4.100.132:44140] PHP Warning: Undefined variable $url in /home/hoge/htdocs/xxxxxx/view.php on line 61
[Thu Feb 09 19:14:23.959844 2023] [php:warn] [pid 18605:tid 26285568] [client 46.4.100.132:44140] PHP Warning: Undefined variable $id in /home/hoge/htdocs/xxxxxx/view.php on line 61
|
外部から、昔々あった機能にアクセスしに来ているみたい。今は提供していない機能なので、古〜いPHP構文が使われていますし互換性チェックにもかけてませんでした。そりゃエラー吐くよね。
昔の機能へのリンクが何処かの外部サイトに残っているのですかね?この際、綺麗に消しておくとしましょう。
これで SIGBUSによる異常終了は回避できましたので、取りあえず PHP 8.0.27 への移行は完了とします。もう暫くウチの Blogを続けられそうです。
バグの修正にはもっと原因調査が必要で、根本的な不具合箇所を特定・修正すべきとは思いますが、PHP 8.0系も今年末でサポート打ち切りとなります。今のうちから PHP 8.1系、8.2系へ移行しなければなりませんので、今回はここまで。
|