絖綛 N@i.jp  昨日:00016130
 今日:00003497
 総計:00057677
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:10/01 12:07


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

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系へ移行しなければなりませんので、今回はここまで。


< 過去の記事 [ 2月の Blog リスト ] 新しい記事 >

2023 calendar
2月
1234
567891011
12131415161718
19202122232425
262728


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.