🌊

今週の PHP 2022/09/24 〜 2022/09/30

2022/10/03に公開

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

Internal

Issues with readonly classes

https://externals.io/message/118554

今週も議論は続く、一つの方向性として

  • 現状の 8.2 でリリースされる readonly はそのまま
  • 将来の拡張性は残しつつも、現状では readonly 同士での継承以外は許されない

さらに、今週加わってきた話として

Readonly は Immutable ではない

という考え方についてです。

つまり、Immutable ではないから、特殊な方法によっては変更することが可能であることを示唆しているとのことです。
ただ、ほとんどのプログラマーは、Readonly = Immutable と捉えるだろう。とも語られており、今後の展開が気になるところです。

なんとなく、Trait のときと同じような雰囲気を感じてきました。(あまり生産的な議論で無くなってきている気もする)

Release 情報

それぞれ、7.4.32, 8.1.11 がリリースされています。

https://www.php.net/ChangeLog-7.php#7.4.32
https://www.php.net/ChangeLog-8#8.1.11

Bugs

Do not require opcache.preload_user in cli SAPIs by arnaud-lb · Pull Request #9515 · php/php-src

https://github.com/php/php-src/pull/9515/files

cli, phpdbg の SAPI では opcache.preload_user の設定がなくても動くようにしようというもの
権限周りの考慮として、SAPI の実行ユーザーが完全に特定可能なのでデフォルトで実行ユーザーを割り当てれば問題ないということ(だと思う)

潔い if 文が記述されています。

bool sapi_requires_preload_user = !(strcmp(sapi_module.name, "cli") == 0
  || strcmp(sapi_module.name, "phpdbg") == 0);

The behavior of mb_strcut in mbstring has been changed in PHP8.1 · Issue #9535 · php/php-src

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

ISO-2022-JP における mb_strcut の問題だけではなく、もっと範囲が広いのではという質問が Tekimen さんから入ってます。
このイシューは、日本語 PHP 界隈には影響が大きそうなので、要チェックです。

話は mb_substitute_character の話に及んでおります。この辺も知識が深くないと理解が難しい。

mb_strpos matches illegal character when needle is '?' · Issue #9613 · php/php-src

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

てきめんさんの new イシュー。

var_dump(mb_strpos("AあいうえおBBcC", "?", 0, "ISO-2022-JP"));
var_dump(mb_stripos("AあいうえおBBcC", "?", 0, "ISO-2022-JP"));
var_dump(mb_strpos("AあいうえおBBcC", "?", 0, "SJIS"));
var_dump(mb_stripos("AあいうえおBBcC", "?", 0, "SJIS"));

? はどこにもないのに、pos が取れるという闇の深いコード。

最初は、cmb さんもこれはエンコーディングが UTF8 じゃなくて SJIS ISO-2022-jp にしてるからでしょ?閉じるよ。と言っていたが

てきめんさんは、イリーガルバイトについてはなしているのだよ!という説明とこのevalで説得

https://3v4l.org/5VFTv

ハードコードされた?が変換後にはいってくるんやぞと

https://github.com/php/php-src/blob/master/ext/mbstring/libmbfl/mbfl/mbfl_convert.c#L108

このイシューについては、ようするに mb_strpos mbstripos の内部挙動の違いによって、各バージョンで互換性を維持できていない現状がある。

UTF8 に変換後に ? が混入された文字列に pos を探しにいくとマッチしてしまうという単純な話なのだけど、そこにバージョンの話と、オーバーホール対応の話が混ざってなんかもう大変。
これ、最終的にどうするんだろう。

Understanding FastCGI (with Ubuntu 22.04) · Issue #56 · renatomefi/php-fpm-healthcheck

https://github.com/renatomefi/php-fpm-healthcheck/issues/56#issuecomment-1256490554

-> 時間をかけてよみたい

unserialize __wakeup bypass · Issue #9618 · php/php-src

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

そもそも、__wakeup __sleep を使ったことがなかった。それぞれ、 unserialize serialize の時に実行されるマジックメソッド。

https://www.php.net/manual/ja/language.oop5.magic.php#object.wakeup

この不具合報告は、unserialize をする時に誤った長さ指定をしたシリアライズ文字列を渡すと、__wakeup がバイパスされて、__destruct 呼ばれるというもの。
最新の master だと segfault が出るということで、かなりニッチな不具合になっていそうです。

gmdate () 1st parameter type is wrong, but there is no error. · Issue #9627 · php/php-src

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

gmdate の引数の型が間違っているのにエラーがでないよ!というイシュー。
これは、strict_types を指定してない場合は、PHPが暗黙の型変換を行ってくれるからです。

https://3v4l.org/k4EsX

イシュー主の期待する動作をさせるには、strict_types を指定します。

https://3v4l.org/jPJeQ

Latest bug fixing introduce performance drop 16% issue · Issue #9634 · php/php-src

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

16% の性能劣化が報告されています。

Wordpress を使った性能テストにおいて、mysqlnd の修正が入る前後で劣化したとのこと。
今後、さらなる詳細が明らかになることでしょう。

原因として取り上げられている修正を見ると、mnd_emalloc で割当するメモリ量が変わっているようです。バッファーオーバーフロー対策ということなので、以前よりもパケットサイズを小さくするようにした結果、劣化したということなのだろうか?

Select the first of month as day when creating a date without day · Issue #9637 · php/php-src

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

要するにフォーマット文字列を省力すると、その日が入ってしまうというもの

https://3v4l.org/8BUbn

実はこんな回避策がある

https://3v4l.org/acarZ

時分秒も

https://3v4l.org/pC7QT

ドキュメントには書いてあるという

All fields are initialised with the current date/time. In most cases you would want to reset these to "zero" (the Unix epoch, 1970-01-01 00:00:00 UTC). You do that by including the ! character as first character in your format, or | as your last. Please see the documentation for each character below for more information.

Discussion