今週の PHP 2022/10/29 〜 2022/11/04
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
リリース
8.1.12 https://www.php.net/ChangeLog-8.php#8.1.12
7.4.33 https://www.php.net/ChangeLog-7.php#7.4.33
7.4 系の EOL 前の最後のリリースです。7.4 系のユーザーは 8系のアップグレードが必要です。
Improve unserialize() error handling
3つの提案について Vote が行われています。
- \UnserializationFailedException and wrap any Throwables in PHP 8.x? (20/12)
- Increase the severity of emitted E_NOTICE to E_WARNING (33/2)
- Throw \UnserializationFailedException instead of emitting E_NOTICE/E_WARNING in PHP 9.0 (23/8)
2番目、3番目の提案が採択されそうな勢いです。
つまり、まずは E_NOTICE を E_WARNING に昇格させて、9.0 で例外を投げるように BCブレークの修正をしようというものです。
Internal 内での話し合いも、Move Forward という前向きの意見が多いですね。
Adding the OpenSSF Scorecards GitHub Action
OpenSSF については、本家サイトをご覧ください。https://securityscorecards.dev/
とりあえず、今回においては、なしよの方向になりまして、PRもクローズされました。
全体的な意見としては、とりあえずよくわからんチェックがいっぱい走るし、毎回やられて CPU リソースとられるのも嫌だなぁという感じです。
最初の方、有用な指摘ポイントの修正が終わったら、あとはあんまり意味ないでしょ?っていう現実的な意見も多かったです。
とはいえ、じゃあ四半期に一回走らせるみたいなのは、誰が音頭取るの?みたいな気にもなるので、難しいところだなと思いました。
[RFC] [Discussion] SQLite3: remove warnings, move to exceptions
こちらについては、着々と RFC が成長してきました。
PHP 9.0 に向けて、 SQLite3 の Warnings を 例外に切り替えようぜというやつです。
unserialize でも行われているように、まずは E_DEPRECATED
を 8.3 で出すようにして、9 でデフォルトの挙動にしようというものです。
Pre RFC - Additions to the randomizer
ランダムな文字列から、ランダムなバイト列を取得する getBytesFromString
もう一つは、ランダムな浮動小数点数を取得する getFloat
, nextFloat
なんか、自分が使わないユースケースの機能追加は、よくわからんな〜って思いつつ、議論継続を見守っています。
Microseconds to error log
新規関数の追加で収まったのかと思いつつ、色々と話し合いが続いている。
PoC はある
見守る。
Multibyte Trim
8ctopus さんが、ついに Internal の ML と通信ができたので、Karma Request がきました。
RFC を待ちましょう。
Stack オーバーフロー検知
Limit stack size by arnaud-lb · Pull Request #9104 · php/php-src https://github.com/php/php-src/pull/9104
[wip] Handle stack overflows by arnaud-lb · Pull Request #9855 · php/php-src https://github.com/php/php-src/pull/9855
その他のちょっとした動き
Readonly クラスの継承の件
Array Unique Identical 関連
Dynamic Class Const Fetch 関連
Bugs
Segmentation fault occurs when timezone database is corrupt · Issue #9847 · php/php-src
/usr/share/zoneinfo
を削除した状態で、 date
関数を使うと SEGV が起こるというもの。
PHP の公式 Docker イメージ (debian) では発生しませんでした。イシュー報告主が使っているミニマルなイメージなどで発生するようです。
SaltStack (using Python subprocess) hangs when running php-fpm 8.1.11 · Issue #9754 · php/php-src
SaltStack は使ったこと無いのですが、構成管理ツールです。
php-fpm を SaltStack を使って起動すると、ハングしてしまうという問題。
こちらが修正内容
stderr の取り回しに問題があったようで、フォアグラウンド実行時のみに限定するような修正がされています。
管理ツール連携は、何を持って正常な状態をするかなどの取り決めが難しいですね。
Array construct/destruct should warn at least for duplicate keys · Issue #9848 · php/php-src
$arr = ['4', 'x' => 5];
// construct with duplicate keys
var_dump(['x' => 4, 'x' => 6]);
var_dump([2 => 4, 2.0 => 6]);
// spread operator leading to duplicate keys
var_dump(['x' => 4, ...$arr]);
// destruct with duplicate keys (it is safe to do, but if same key should be assigned to another variable too, it can be done after the destruct)
['x' => $a, 'x' => $b] = ['x' => 10];
var_dump([$a, $b]);
重複するキーに対する配列生成処理は、せめて Warning を出さんか?というイシュー
まだまだ、議論中です。
静的解析でも検出できんかね?など。
Segfault in opcache during autoloading of class in destructor · Issue #9853 · php/php-src
destructor で クラスの autoload を行うと SEGV が出るというイシュー
追加の情報待ち
json_decode Failed to ignore incorrect utf8 · Issue #9858 · php/php-src
<?php
$contents= '{"val": "测试 test \uD83D\uDD17 \uD83D..."}';
$body = json_decode($contents, true, 512, JSON_INVALID_UTF8_IGNORE | JSON_THROW_ON_ERROR);
正しくない UTF8 文字列が含まれた JSON のパースに失敗するというイシュー
そもそも、json_decode
に JSON_INVALID_UTF8_IGNORE
というオプションがあることを知らなかった。
この挙動自体は確認できましたが、Java や Python ではパースできるのに、PHPでは駄目なの??ということで、現在コミッター間での確認中
Time zone bug with \DateTimeInterface::diff() · Issue #9866 · php/php-src
異なるタイムゾーン指定で、\DateTimeInterface::diff()
を取ると 8.1 系で計算がおかしいというもの
とてもわかりやすく不具合。
同じタイムゾーン https://3v4l.org/RK34h
違うタイムゾーン https://3v4l.org/nmPAj
おそらく、関連イシュー https://github.com/php/php-src/issues/9880
PCRE JIT produces wrong result on ~8192-byte strings · Issue #9869 · php/php-src
8192 byte を越える文字列に対して PCRE と PCRE-JIT で結果が異なるというイシュー
実際に上記の 3v4l を見ると違っています。
これは、PCRE2 の不具合のようなので、報告者の方は PCRE2 側にイシューを立ててくれています。
何を言ってるか全然わからねーけど、JIT 最適化のコードに修正が必要なようです。
我々がじゃあ何に気をつけたら良いのかというと「8192 byte 以上のマッチを必要とする正規表現は、気をつけようね。」ということです。
array_merge
should be optimized more · Issue #9881 · php/php-src
配列を持つ配列に対する繰り返しの array_merge
は最適化できるぞ!というイシュー
O(n)
から O(1)
に出来るよという。
SplFileObject::__toString() reads next line · Issue #9883 · php/php-src
SplFileObject が参照するたびに次の行を参照してしまうという不具合
不具合は、7.2 のときの修正に含まれていた。
fgets
が使われているので、cursor が進んでしまうということでした。
しかし、こんなに長く放置されるということは、SplFileObject は誰も使ってないということか?
[PHP 8.0.25] Function JIT may skip implicit type conversion in some cases, causing an error · Issue #9885 · php/php-src
Function JIT が、暗黙的な型変換をスキップしているため、エラーが発生するというイシュー
イシュー上に書かれたコードだと、Type Error
が発生します。 Tracing JIT であれば問題ないということ。
バージョンが 8.0.25 ということで報告がでています。
JIT 関連はとかく細かい不具合が多いですね。
新しいフィーチャーが PHP に入った場合は、JIT の検証もしたほうがよいのか。
[PHP 8.0.25] Occasional segmentation faults while autoloading · Issue #9879 · php/php-src
上の JIT 不具合は、7.3 系から 8.0.25 系にアップグレードした際に発覚したということでした。
Occasional
ということですから、SEGV は必ず発生するわけではなく、発生要因がよくわからないらしい。
ただし、JIT を disable すれば、大丈夫になるということなので、JIT関連であることは間違いないということです。
7.4 が EOL を迎えますが、8系に更新したあとに、よくわからない SEGV が発生する場合は、とりあえず JIT を OFF にすると良いですね。
session_regenerate_id multiple calls to create_sid and validateId · Issue #9888 · php/php-src
session_regenerate_id
に関する動作不具合の報告
7.4.5 のときの修正で入ったようです。
session_create_id
は直ったが、 session_regenerate_id
で余計な関数コールが発生しているもよう。
zend_extension
php.ini uses different path discovery than extension
· Issue #9893 · php/php-src
zend_extension
, extension
で ini のディスカバリーが異なるという不具合
発生は Windows なので、Linux, Mac ユーザーは関係なし
Discussion