今週の PHP 2023-01-07 〜 2023-01-13
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
A set of 18 functions/changes to improve PHP core - Externals
CubicleSoft の 18個の関数について、PHP core の改善として提案したいというイシュー。18個 RFC 必要ですか?という。
関連するコンポーネントごとに、分割すればよいのでは?というコメントが入っています。
そもそも、pecl でインストール出来るようになっているようです。インメモリーで高速に処理を行うと書いてあります。
Ability to set DONTFRAGMENT for UDP packets in ext/sockets - Externals
UDP Packet に対して DONTFRAGMENT
を設定できるようにするというのはどうだろうというお便り。
全くコメントが付いていないです。
POSIX Socket の Man ページに、なにがしかの手がかりがないかなと思ったのですが、見つけられませんでした。クライアント実装では、 DONTFRAGMENT
についての記述があるライブラリなどがあったので、存在はするようですね。
ext-random: add random_float() ? - Externals
暗号学的にセキュアではない lcg_value
の代わりに random_float
を追加しようぜ。という zeriyoshi さんからのお便り。
そもそも、lcg_value
の存在を知りませんでした。
https://www.php.net/manual/ja/function.lcg-value.php
random については、詳しくないので薄い理解になってしまうのですが、 Randomizer
を使ってラッパー関数を自前で作るのは簡単なので、random_float
の追加には反対というコメントがありました。
浮動小数点数は、扱いが難しいですね。
というわけで、お便りは lcg_value
を段階的に廃止しようの方向に向かっています。
base64url format - Externals
JWT を使用している方からのお便り
base64url_encode
base64url_decode
を追加してほしいというお願い。
下記のような polyfill を使っているが、無駄な文字列コピーが多発するので、効率が悪いとのこと
function base64url_decode(string $str): string {
return base64_decode(str_pad(strtr($str, '-_', '+/'), (4 -
(strlen($str) % 4)) % 4, '='));
}
function base64_encode(string $str): string {
return rtrim(strtr(base64_encode($str), '+/', '-_'), '=');
}
良さそうじゃんというコメントの他に、base64_encode
にオプションを入れたら良いのでは?などの意見もありました。
いずれにしろ RFC を作成する流れになりそうです。
Adding strtotime change to migration document - Externals
strtotime
に細かな修正が入っているけど、小さい BC ブレークでも移行ドキュメントに追加してほしいというお願い。
+-3 days
みたいな変なパターンの文字列が使えたり、使えなかったりするのは確かにストレスが溜まりそうです。
changelog に入れたら良いのでは?という提案がありましたが、まあ普通の人は見ないよね。というわけで、ドキュメントに追加されました。
https://github.com/php/doc-en/commit/cf220d0944b207510abb5e3c7c262140b8ac082c
Bugs
random: Fix check before closing `random_fd` by TimWolla · Pull Request #10247 · php/php-src
random_fd
が 0 になったときに、fd のクローズされていないというイシュー。
実にキレイな境界値問題ですね。
https://github.com/php/php-src/pull/10247/files
Preloading anonymous class inheriting from autoloaded unlinked class leads to return type error · Issue #10131 · php/php-src
Preloading が失敗するというイシューです。
条件が難しく、無名クラスが preload された具象クラスを継承しているパターンです。下記のイシューコメントは、この現象の詳しい説明をしています。
https://github.com/php/php-src/issues/10131#issuecomment-1374834160
ちょっと一回では頭に入らなかったので、別途ブログポストにしてみようと思います。
Some performance improvements for UTF-8 processing by alexdowad · Pull Request #10257 · php/php-src
UTF-8 処理のパフォーマンス改善 PR
コードポイントの確認を行う if 文の条件が削られています。0xE0 >=
という条件が削られていて、もともとは $
マーク以降の文字を対象にチェックしてたっぽい。どういうことなのか、あんまり良くわかってないです。
https://github.com/php/php-src/pull/10257/files
DateTimeZone fails to parse time zones that contain the "+" character · Issue #10218 · php/php-src
日付文字列の解釈については、あちらを直すとこちらが壊れるみたいな状況がよく見られます。
このイシューは、下記のイシュー修正が原因で入ったようです。
https://github.com/php/php-src/issues/9700
時刻のパースは、なるべく保守的にしていかないと、思わぬ不具合を引いてしまうという教訓。
srand(0) set random seed to 0 instead random · Issue #10292 · php/php-src
これはまずいやつ。
srand(0)
を実行するとシードが 0 で固定されてしまうという不具合。速攻修正されました。
https://github.com/php/php-src/pull/10380/files
Zeriyoshi さんからは、BC Break である旨のコメントがありました。コレを機会に一気に Deprecation に向かう流れでコミュニティの態度は一致しているような気がする。
PHP 8.3 の Deprecation としてドキュメントも記述されました。
https://wiki.php.net/rfc/deprecations_php_8_3#global_mersenne_twister
echo mb_convert_case("ΚΑΛΗΣΠΕΡΑ ΣΑΣ", MB_CASE_TITLE, "UTF-8");
mb 系なので、オーバーホールの影響かと思ったら、以前から誤った状態になっていたようです。
すでに修正されていますが、マルチバイト対応は大変ですね。
Weird systemctl status phpX.Y-fpm output on Ubuntu 22.04 · Issue #10204 · php/php-src
Ubuntu の 22.04 において、 php-fpm の status 表示がバグっているというイシュー。
どうやったらこうなるんだろう。面白いですね。
ただ、php-fpm 周りは、割とアクティブに bug fix が入るので、混入するチャンスはたくさんありそうです。
Discussion