😸

今週の PHP 2022/11/19 〜 2022/11/25

2022/11/26に公開

PHP のメーリングリストから、気になった情報をピックアップします。

Internal

リリース

8.1 系の最新リリースがありました。各種バグフィックスが入っています。

https://www.php.net/ChangeLog-8.php#8.1.13

延期されている 8.2 ですが、RC7 がリリースです。まだまだ、コア周りの修正マージが入ってきています。次は間に合うといいな...

8.2.0RC7 https://downloads.php.net/~pierrick/

Microseconds to error log

https://externals.io/message/118865

マイクロ秒をログに入れましょうという提案の続報です。

  • php_format_timestamp という関数を追加(Cのソース)
  • error_log_usec という設定項目を追加

修正内容は下記です。

https://github.com/php/php-src/pull/9844

これについては、php_format_date にフォーマットはまとめた方が良くない?っというレビューコメントが付きましたが、internals の今までの議論で、BC Break はやめようといわれた件が返信されてます。

ところで、これって RFC いらないやつなのかな??

PHP_STREAM_TO_ZVAL

https://externals.io/message/119027

マクロの話。

PHP_STREAM_TO_ZVAL は、なんでこの名前なの?というお便り。 実際の処理内容は php_stream_from_res ということで、逆のような内容です。

「間違えたんじゃない?修正PRください」という返事がありました。

現職のソースコードでも、名前と処理内容が異なるケースがあるんですが、ソースコードを読む際にめちゃくちゃ困るので、こういう指摘&修正は良いですね。

PHP: rfc:randomizer_additions

https://wiki.php.net/rfc/randomizer_additions

vote 終了です。2つの提案がありましたが、両方とも受理されました。めでたし。

Using less generic exceptions for dates - Externals

https://externals.io/message/119020

new DateTime('foo');

このコードは、Exception をスローします。これ、一般的すぎませんか?もうちょっと、詳細な例外を出しませんか?

例えば DateException というお便り。

Tim さんからは、DateException を頂点とした例外ツリーを作ると良いのでは?という提案

なお、例として Random の際の例外ツリーの実装をあげてくれました。

https://github.com/php/php-src/pull/9220

Bugs

FPM does not reset fastcgi.error_header · Issue #9981 · php/php-src

https://github.com/php/php-src/issues/9981

fastcgi.error_haeder の設定に HTTP/1.1 500 Internal Server Error などが設定されていた場合に

  1. 実際にエラーが発生すると、設定したヘッダーが送られる。
  2. その後、同じ fpm の child が処理するリクエストは、成功したとしても status コードが 500 のままになってしまう。

そもそも、設定したことないけど、これは明白に不具合。
こんなの気づけない。怖い。

修正はこちら

https://github.com/php/php-src/commit/5a4520bc2bc1698c4e7d1dc19956ce5519331e02

For UTF-7, flag unnecessary extra trailing byte in Base64 section as error by alexdowad · Pull Request #9977 · php/php-src

https://github.com/php/php-src/pull/9977

UTF-7 における Base64 section の余剰バイトのフラグをエラーとして扱うという不具合の修正

そもそも、UTF-7 を扱う機会というものはそれほどあるのだろうか?もしくは、意識せずに使っているのか。
いずれにしろ修正されたことは良いこと。

Implement $this return type by nikic · Pull Request #7470 · php/php-src

https://github.com/php/php-src/pull/7470

いわゆる Fluent API と呼ばれる、インスタンスのメソッドが、インスタンス自身を返す $this という返り値について、ナイスアイデアだけど、なんで止まってるの?
という、素朴な質問が投げかけられていました。

RFC は下記。

PHP: rfc:this_return_type https://wiki.php.net/rfc/this_return_type

なるほど、便利そう。PHPStan 使えば、今でも出来ますね。(self でも OK)

https://phpstan.org/r/9d78ff30-a222-4e98-a6f3-5f16ad4ef0d0

Fix GH-8517: FPM child pointer can be possibly uninitialized by bukka · Pull Request #9444 · php/php-src

https://github.com/php/php-src/pull/9444

FPM の child のポイントが初期化されていない可能性があるというイシューの修正
このせいで、CPU負荷の高い環境において、他のユーザーが実行している PHP-FPM の child に差し替わるなどの不具合が発生しているようです。

Significant reduction in performance when running phpunit after upgrade from 8.1.9 to 8.1.10 · Issue #9993 · php/php-src

https://github.com/php/php-src/issues/9993

PHP 8.1.10 以降で、PHPUnit の実行速度がめちゃくちゃ遅くなってるんですが!?というお便り。

PHP 8.1.7: Time: 05:13.226, Memory: 829.00 MB
PHP 8.1.9: Time: 05:23.756, Memory: 831.00 MB
PHP 8.1.10: Time: 12:25.195, Memory: 773.00 MB
PHP 8.1.12: Time: 11:59.423, Memory: 773.00 MB

Significant って、どれくらいっておもったら、倍以上じゃん!ってわけです。

Xdebug turned off と書いてあるので、誤って Xdebug 使ってたみたいな話ではないようです。メモリ使用量は若干下がっているというのもポイントかもしれません。
空間計算量を犠牲にして成り立っていた何かが、改善された結果かも。

憶測で語ってもしょうがないので、続報を待ちましょう。

Segmentation Fault during OPCache Preload in PHP 8.1+ · Issue #9968 · php/php-src

https://github.com/php/php-src/issues/9968

link されていないクラスの定数利用が含まれる場合に preload が SegV を発生させるというバグ
早々に Fix されました。

https://github.com/php/php-src/commit/91b3b58f7128f50cdd91266261a7562c04fe6ef6

link されていないというのは、autoload には含まれていないということらしく。イシューを上げてきた人のソフトウェアにおいてはデザインとして、そのような構造になっているそうです。

Discussion