🐱

今週の PHP 2022/07/16 〜 2022/07/22

2022/07/22に公開

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

PHP 8.2 をターゲットにした RFC の投票結果発表が相次ぎました。

Internal

Accepted

PHP: rfc:constants_in_traits

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

https://github.com/php/php-src/pull/8888

五十嵐さんからは、最後のひと押し。「投票はともかく、せっかくだから実装は見てね!!」

最終的に 70% の賛成票にて Accepted。

PHP: rfc:iterator_xyz_accept_array

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

Accepted めでたい。

iterator_to_array, iterator_count は引数にすべての iterable を受け取ることができるようになります!

Declined

PHP: rfc:json_encode_indentation

https://wiki.php.net/rfc/json_encode_indentation#vote

Json indent 用のパラメーター導入ですが、否決されました。

PHP: rfc:curl-url-api

https://wiki.php.net/rfc/curl-url-api

こちらも否決。少しコミュニケーションが足りなかった感じでした。必要性については否定されていなかったので、再チャレンジして欲しい。


Feature Freeze

8.2 向けの フィーチャーフリーズについてです。PHP のリリースプロセスについては、下記のマークダウンにかかれている。

https://github.com/php/php-src/blob/master/docs/release-process.md

ドキュメントのリリースプロセスの記述がおかしいねなどのやりとりがありましたが、無事にフィーチャーフリーズ。

PHP 8.2 に入り込むフィーチャーは、以下の milestone から確認出来ます。

https://github.com/php/php-src/milestone/4

PSA: Wiki's voting doodle supports autoclosing at a given point in time

RFC の Vote は本来クローズされるべき時間よりも延長してクローズされることが多い。なぜなら手動でやってるから。
じつは、closeon というアトリビュートを設定すると、指定時間にクローズ出来るらしい。

なので、サンプルを更新しておいたよ!というお話。

https://wiki.php.net/rfc/howto?do=diff&rev2[0]=1639568697&rev2[1]=1658250816&difftype=sidebyside

ちゃんとタイムゾーンも指定できますね!

個人的にも少し気になっていた件ですし、タイムゾーンの関係で海外に配慮した時間で vote 開始した場合、閉じるの大変だなと思っていたのでこれは良い話。


Random Extension

すでに、Random 拡張のソースコードが 8.2 にマージされているのですが、RC 版を使った方から早速イシューが上がってきています。

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

そして、こちらが修正の PR

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

Thread Safe 対応についての指摘も

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

これに対しては cmb さんからの PR で修正が入っている

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

これがコミュニティの力か!(なお、全然意味が分からない!)

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

もう一件、こちらは __construct を実在するオブジェクトに対して後からコールするとメモリーリークしているという件。
そんなに頑張りすぎるなよ!という心温まるリプライ、かつ実際のプログラムではまあ起きないだろうというケース。


8.2.0 Beta1

ベータリリースです。 Random 拡張も試せますね!

https://www.php.net/archive/2022.php#2022-07-21-1

Bugs

do not silently truncate the key in openssl_encrypt() · Issue #9026 · php/php-src

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

null 文字で許容される最大文字数以上にセットしても、暗黙のうちに key が truncate されているというイシュー
null 文字は C側では終端文字扱いだから、これはそうなのでは?と思ったがどうなのだろう。

Array numeric string key gets converted to int · Issue #9029 · php/php-src

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

不具合ではなく仕様だったイシュー。

https://3v4l.org/ROJpb

https://www.php.net/manual/en/language.types.array.php#language.types.array.syntax

Strings containing valid decimal ints, unless the number is preceded by a + sign, will be cast to the int type. E.g. the key "8" will actually be stored under 8. On the other hand "08" will not be cast, as it isn't a valid decimal integer.

日本語マニュアル

10 進数の int として妥当な形式の String は、 数値の前に + 記号がついていない限り、 int 型にキャストされます。 つまり、キーに "8" を指定すると、実際には 8 として格納されるということです。一方 "08" はキャストされません。これは十進数として妥当な形式ではないからです。

というわけで、数字として妥当な形式の string は int 型にキャストされます。ご注意を。

Performance regression when unpacking a generator yielding objects · Issue #9030 · php/php-src

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

実に面白そうなイシュー

不具合の導入がこれだというのだけど、なぜだろう?

https://github.com/php/php-src/commit/52cf7ab8a27ace6fbff60674d7aeecf4adec1bc8

change log を見ると 8.1.0 で入っているので、8.1系は駄目っぽい

手元のマシンで計測してみたところ

8.1系 270msec 程度
8.0系 160msec 程度

倍とはいかないまでも、速度劣化が出ている。

Sqlite ATTACH is crashing php when the filename is bind /w open_basedir set · Issue #9032 · php/php-src

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

open_basedir がセットされた環境で、Sqlite の ATTACH を行うと PHP がクラッシュするというイシュー

https://github.com/cmb69/php-src/commit/be609a89fd118ce42033d2f43040030c142af319

file 名に NULL が渡ってくるというケース漏れでした。 open_basedir はディレクトリトラバーサル攻撃などを防ぐために有効な設定ですが、Sqlite はその設定がされているパターンが実装されていなかったということのようです。

https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_3.html

Segfault with JIT and large match/switch statements · Issue #8030 · php/php-src

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

ARM で、match/swith 文が JIT コンパイル時にセグフォを起こすというイシュー

修正されてるけど、まじでわからん

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

NumberFormatter currency format mismatch on Windows and Linux · Issue #9034 · php/php-src

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

ICU が ICU-DATA-FULL を分割した影響を受けたイシューがまた出た。

https://github.com/docker-library/php/issues/1302

こっちで、根本から治らない限りいつまでも続く。

mb_detect_encoding(): wrong results with null $encodings · Issue #9008 · php/php-src

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

PHP 8.1 で混入

mb_detect_encoding が null $encodings で誤った結果を返すというもの

Fix GH-9008: mb_detect_encoding(): wrong results with null $encodings · php/php-src@c2bdaa4 https://github.com/php/php-src/commit/c2bdaa48e17a56f0d8e61728ecb30915f0db857b

encoding 周りは他のイシューも出ている。

The order of $encodings parameter in mb_detect_encoding() is sometimes ignored · Issue #1708 · php/doc-en https://github.com/php/doc-en/issues/1708

8.1系のこの辺は、もう少し深く調べておく必要があるかもしれない。

Discussion