🐢

今週の PHP 2022/10/29 〜 2022/11/04

2022/11/08に公開約7,000字

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

https://wiki.php.net/rfc/improve_unserialize_error_handling

3つの提案について Vote が行われています。

  1. \UnserializationFailedException and wrap any Throwables in PHP 8.x? (20/12)
  2. Increase the severity of emitted E_NOTICE to E_WARNING (33/2)
  3. 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

https://wiki.php.net/rfc/sqlite3_exceptions

こちらについては、着々と RFC が成長してきました。
PHP 9.0 に向けて、 SQLite3 の Warnings を 例外に切り替えようぜというやつです。

unserialize でも行われているように、まずは E_DEPRECATED を 8.3 で出すようにして、9 でデフォルトの挙動にしようというものです。

Pre RFC - Additions to the randomizer

https://wiki.php.net/rfc/randomizer_additions

ランダムな文字列から、ランダムなバイト列を取得する getBytesFromString
もう一つは、ランダムな浮動小数点数を取得する getFloat , nextFloat

なんか、自分が使わないユースケースの機能追加は、よくわからんな〜って思いつつ、議論継続を見守っています。

Microseconds to error log

新規関数の追加で収まったのかと思いつつ、色々と話し合いが続いている。

PoC はある

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

見守る。

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 クラスの継承の件

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

Array Unique Identical 関連

https://github.com/php/php-src/pull/9804
https://github.com/php/php-src/pull/9882

Dynamic Class Const Fetch 関連

https://github.com/php/php-src/pull/9793
https://wiki.php.net/rfc/dynamic_class_constant_fetch

Bugs

Segmentation fault occurs when timezone database is corrupt · Issue #9847 · php/php-src

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

/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

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

SaltStack は使ったこと無いのですが、構成管理ツールです。
php-fpm を SaltStack を使って起動すると、ハングしてしまうという問題。

こちらが修正内容

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

stderr の取り回しに問題があったようで、フォアグラウンド実行時のみに限定するような修正がされています。

管理ツール連携は、何を持って正常な状態をするかなどの取り決めが難しいですね。

Array construct/destruct should warn at least for duplicate keys · Issue #9848 · php/php-src

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

$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]);

https://3v4l.org/NTFPM

重複するキーに対する配列生成処理は、せめて Warning を出さんか?というイシュー

まだまだ、議論中です。
静的解析でも検出できんかね?など。

Segfault in opcache during autoloading of class in destructor · Issue #9853 · php/php-src

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

destructor で クラスの autoload を行うと SEGV が出るというイシュー
追加の情報待ち

json_decode Failed to ignore incorrect utf8 · Issue #9858 · php/php-src

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

<?php
    $contents= '{"val": "测试 test  \uD83D\uDD17 \uD83D..."}';
     $body = json_decode($contents, true, 512,  JSON_INVALID_UTF8_IGNORE | JSON_THROW_ON_ERROR);

正しくない UTF8 文字列が含まれた JSON のパースに失敗するというイシュー
そもそも、json_decodeJSON_INVALID_UTF8_IGNORE というオプションがあることを知らなかった。

この挙動自体は確認できましたが、Java や Python ではパースできるのに、PHPでは駄目なの??ということで、現在コミッター間での確認中

Time zone bug with \DateTimeInterface::diff() · Issue #9866 · php/php-src

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

異なるタイムゾーン指定で、\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

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

https://3v4l.org/dcNij

8192 byte を越える文字列に対して PCRE と PCRE-JIT で結果が異なるというイシュー
実際に上記の 3v4l を見ると違っています。

これは、PCRE2 の不具合のようなので、報告者の方は PCRE2 側にイシューを立ててくれています。

https://github.com/PCRE2Project/pcre2/issues/156

何を言ってるか全然わからねーけど、JIT 最適化のコードに修正が必要なようです。

我々がじゃあ何に気をつけたら良いのかというと「8192 byte 以上のマッチを必要とする正規表現は、気をつけようね。」ということです。

array_merge should be optimized more · Issue #9881 · php/php-src

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

配列を持つ配列に対する繰り返しの array_merge は最適化できるぞ!というイシュー
O(n) から O(1) に出来るよという。

SplFileObject::__toString() reads next line · Issue #9883 · php/php-src

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

SplFileObject が参照するたびに次の行を参照してしまうという不具合

不具合は、7.2 のときの修正に含まれていた。

https://github.com/php/php-src/pull/3820
-> 修正で 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

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

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

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

上の 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

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

session_regenerate_id に関する動作不具合の報告

7.4.5 のときの修正で入ったようです。

https://github.com/php/php-src/commit/b510250b8ebe9d90b1db150d7a1edc75893f2e48

session_create_id は直ったが、 session_regenerate_id で余計な関数コールが発生しているもよう。

zend_extension php.ini uses different path discovery than extension · Issue #9893 · php/php-src

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

zend_extension, extension で ini のディスカバリーが異なるという不具合

発生は Windows なので、Linux, Mac ユーザーは関係なし

Discussion

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