🤖

今週の PHP 2023-01-07 〜 2023-01-13

2023/01/25に公開約4,900字

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

Internal

A set of 18 functions/changes to improve PHP core - Externals

CubicleSoft の 18個の関数について、PHP core の改善として提案したいというイシュー。18個 RFC 必要ですか?という。

関連するコンポーネントごとに、分割すればよいのでは?というコメントが入っています。

https://github.com/cubiclesoft/php-ext-qolfuncs

そもそも、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

これはまずいやつ。

https://3v4l.org/JmA3c#v8.2.1

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 系なので、オーバーホールの影響かと思ったら、以前から誤った状態になっていたようです。

https://3v4l.org/S4kv3

すでに修正されていますが、マルチバイト対応は大変ですね。

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

ログインするとコメントできます