今週の PHP 2022/09/24 〜 2022/09/30
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
Issues with readonly classes
今週も議論は続く、一つの方向性として
- 現状の 8.2 でリリースされる readonly はそのまま
- 将来の拡張性は残しつつも、現状では readonly 同士での継承以外は許されない
さらに、今週加わってきた話として
Readonly は Immutable ではない
という考え方についてです。
つまり、Immutable ではないから、特殊な方法によっては変更することが可能であることを示唆しているとのことです。
ただ、ほとんどのプログラマーは、Readonly = Immutable と捉えるだろう。とも語られており、今後の展開が気になるところです。
なんとなく、Trait のときと同じような雰囲気を感じてきました。(あまり生産的な議論で無くなってきている気もする)
Release 情報
それぞれ、7.4.32, 8.1.11 がリリースされています。
Bugs
Do not require opcache.preload_user in cli SAPIs by arnaud-lb · Pull Request #9515 · php/php-src
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
ISO-2022-JP
における mb_strcut の問題だけではなく、もっと範囲が広いのではという質問が Tekimen さんから入ってます。
このイシューは、日本語 PHP 界隈には影響が大きそうなので、要チェックです。
話は mb_substitute_character
の話に及んでおります。この辺も知識が深くないと理解が難しい。
mb_strpos matches illegal character when needle is '?' · Issue #9613 · php/php-src
てきめんさんの 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で説得
ハードコードされた?
が変換後にはいってくるんやぞと
このイシューについては、ようするに mb_strpos
mbstripos
の内部挙動の違いによって、各バージョンで互換性を維持できていない現状がある。
UTF8 に変換後に ?
が混入された文字列に pos を探しにいくとマッチしてしまうという単純な話なのだけど、そこにバージョンの話と、オーバーホール対応の話が混ざってなんかもう大変。
これ、最終的にどうするんだろう。
Understanding FastCGI (with Ubuntu 22.04) · Issue #56 · renatomefi/php-fpm-healthcheck
-> 時間をかけてよみたい
unserialize __wakeup bypass · Issue #9618 · php/php-src
そもそも、__wakeup
__sleep
を使ったことがなかった。それぞれ、 unserialize
serialize
の時に実行されるマジックメソッド。
この不具合報告は、unserialize
をする時に誤った長さ指定をしたシリアライズ文字列を渡すと、__wakeup
がバイパスされて、__destruct
呼ばれるというもの。
最新の master だと segfault が出るということで、かなりニッチな不具合になっていそうです。
gmdate () 1st parameter type is wrong, but there is no error. · Issue #9627 · php/php-src
gmdate
の引数の型が間違っているのにエラーがでないよ!というイシュー。
これは、strict_types
を指定してない場合は、PHPが暗黙の型変換を行ってくれるからです。
イシュー主の期待する動作をさせるには、strict_types
を指定します。
Latest bug fixing introduce performance drop 16% issue · Issue #9634 · php/php-src
16% の性能劣化が報告されています。
Wordpress を使った性能テストにおいて、mysqlnd の修正が入る前後で劣化したとのこと。
今後、さらなる詳細が明らかになることでしょう。
原因として取り上げられている修正を見ると、mnd_emalloc で割当するメモリ量が変わっているようです。バッファーオーバーフロー対策ということなので、以前よりもパケットサイズを小さくするようにした結果、劣化したということなのだろうか?
Select the first of month as day when creating a date without day · Issue #9637 · php/php-src
要するにフォーマット文字列を省力すると、その日が入ってしまうというもの
実はこんな回避策がある
時分秒も
ドキュメントには書いてあるという
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