♨️

今週の PHP 2022/10/08 〜 2022/10/14

2022/10/15に公開

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

Internal

PHP: rfc:deprecations_php_8_3

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

インターナルで議論されている非推奨系の話は、ここにマッシュアップされるようです。
この RFC が作成されていたことを気づいてなかった。Core Roundup のおかげで気づけました。

mt_rand が非推奨になる!

Preventing stack overflows - Externals

大垣さんからの投稿は

Fatal エラーが発生した場合、PHP はスタックdumpを許可してない。大昔の PHP は E_ERROR をユーザー定義のエラーハンドラーでキャッチ出来たが、自分で自分の足を打つようなものだから、現在では無効化されている。

Fatal エラーだと、エラー発生箇所程度は分かるけど、スタックdump というのはスタックトレーズ全体としては出せないということなのかな??

これに対して、投稿主は Fatal エラー自体にも問題はあるが、今回自分が提案している方法なら、無限ループがメモリ不足を起こす前に、スタックサイズの制限で検知できるよ。と

だんだん、この話、「良さそうだな?」と感じられてきた。

[VOTE] Improve unserialize() error handling - Externals

https://externals.io/message/118813

Timさんが作業してきた件ですが、VOTE 開始です。

小さく別れた3つの提案に対しての投票で、今のところは可決されそうな雰囲気があります。

unserialize 周りは、関連の挙動も含めて、あまり統一感がない状況なので、このRFCは、ぜひ可決されてほしい。

この RFC の内容については、別途詳細に読み込んで解説したいと思います。

RFC [Discussion]: Randomizer Additions - Externals

https://externals.io/message/118810

ext-Random へのメソッド追加ですが、PoC を経由しつつ、RFC が作成されました。

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

下記の3メソッドが追加予定です。

final class Randomizer {
    // […]
    public function getBytesFromAlphabet(string $alphabet, int $length): string {}
    public function nextFloat(): float {}
    public function getFloat(float $min, float $max): float {}
}

Feature preview (formely was: experimental features) - Externals

https://externals.io/message/118800

先週までは実験的機能という名前で議論されていたものですが、フィーチャープレビューという名前になって再登場。
対話が再開されています。

今の所、否定的な意見が多いのですが、どういう流れになっていくのか見守りたいです。

Sanitize filters - Externals

https://externals.io/message/118723

フィルター、サニタイズという言葉の紛らわしさや、PHPにおけるコンテキストなどが語らており、ちょっと小さくまとめるのが難しいです。
非常に面白い話なので、こちらも別途とりあげたい。

RFC json_validate Accepted - Externals

https://externals.io/message/118784

わーい、可決!


Bugs

PHP :: Bug #51056 :: fread() on blocking stream will block even if data is available

https://bugs.php.net/bug.php?id=51056

かなり古いイシューですが、修正が入っています。

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

修正内容を見てみると、バッファされた読み込みデータある場合は、ブロッキングを解除しましょうねということらしい。

pg_field_type first call is very slow · Issue #9692 · php/php-src

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

ちょっと興味があったのでウォッチしていたイシュー。pg_field_type の最初のコールだけやけに遅いという指摘。
遅いという議論のなかで、きちんと計測データが載っていたりして、わかりやすかった。

遅くなっている理由は、pg_field_type の最初のコールで、DBサーバーに型の情報を取得しにいって、以後はキャッシュを使うという仕組みらしいので、まあしょうがないなという感じ。

RFC - json_validate() by juan-morales · Pull Request #9399 · php/php-src

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

PHP 8.3 に取り込まれた最初のフィーチャーです! おめでとうございます。

[Question]About superglobal $_GET and urldecode() · Issue #9694 · php/php-src

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

ドキュメントによると、$_GET は自動で urldecode されているらしいけど、ソースどこ?という質問

php_auto_globals_create_get だよという優しい回答。

DateTimeImmutable::diff differences in 8.1.10 onwards - timezone related. · Issue #9699 · php/php-src

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

Timezone をまたいだ 日付の diff が8.1.10以降で変わってしまっているというイシュー。
めちゃくちゃ変わってるじゃん。

これは影響が大きそうです。

DateTime::createFromFormat with two identical timezones resolves to false · Issue #9700 · php/php-src

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

さっきの不具合とは別で、タイムゾーン入りの日付フォーマットが解釈されないというイシュー。
ドキュメントにおける日付フォーマットがおかしいという側面と、パーサーが中括弧の取り扱いに失敗しているという側面がありそう。

Problem when ISO-2022-JP-MS is specified in mb_encode_mimeheader · Issue #9683 · php/php-src

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

EC-CUBE派生のバグチケットですが、マージされたようです。

いやー、しかし、マイナーバージョンで壊れるのは厳しい。

A override for a trait methods. · Issue #9702 · php/php-src

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

Trait のオーバーライドができたら嬉しくない?っていうイシュー
Trait は継承ではない。ということで終了しそう。

ダミアンさんの提案として、下記のように別名を付けてラップしてあげれば出来るよというコード例

https://3v4l.org/QiV28

疑似デコレーターパターンみたいな感じですね。

Deprecate SplFixedArray::__wakeup() by TysonAndre · Pull Request #9704 · php/php-src

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

どうも、 unserialize にかかわ自動実行の関数群については、脇が甘くなっているようです。
PHP 8.3 に対しては、unserialize の挙動改善の RFC が出ているので、改善されていくのを期待。

phpdbg memory leaks by option "-h" · Issue #9710 · php/php-src

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

phpdbg を -h オプションつけて実行するとメモリーリークしてクラッシュするという案件

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

関連イシューも上がってきており、にわかに活気づいています。

Allowing use throw many times · Issue #9715 · php/php-src

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

throw いっぱい書けちゃうじゃん!というイシュー

throw は 8.0 以降は式なので、これは正しい挙動

https://3v4l.org/4cd1b

Fiber: add shadow stack support by chen-hu-97 · Pull Request #9283 · php/php-src

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

Fiber 関連の議論になると必ず出てくる https://github.com/boostorg/context
いつか、理解できるようになるぞ!

(つまり、shadow stack については、まったくよくわからない)

PDO_MySQL does not support cursors · Issue #1883 · php/doc-en

https://github.com/php/doc-en/issues/1883

MySQL はスクロールカーサーをサポートしてないので、ドキュメントイシュー送り。

ところで、スクロールカーサーとは何なんだろう??

Too big integer token should produce a warning · Issue #9734 · php/php-src

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

でかすぎる int はワーニングを出すべきでは?というイシュー

現状では、ひっそりと float に変換されます。過去には Big int という RFC もあったもよう。

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

関連の話も上がってきており、にわかに int オーバーフローが騒がしい

Add intadd function by adsr · Pull Request #9742 · php/php-src https://github.com/php/php-src/pull/9742#issuecomment-1278895481

Fiber stack variables do not participate in cycle collector · Issue #9735 · php/php-src

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

今の俺には理解できないが Fiber のイシュー。

Microseconds to error log · Issue #9745 · php/php-src

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

負荷の高いサービスを運営しているので、ログにマイクロ秒を入れたいんだがというイシュー。
現状では、スタンダードな方法が確立されておらず、どうするのが良いかな?という相談

実に良いイシューで、この先、順調に議論が重ねられるといいなと思う。要チェックです。

Symfony preloading fails on PHP-8.2 with JIT · Issue #9746 · php/php-src

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

原因とかは判明していませんが、 PHP-8.2系で、Symfony の preloading が失敗するとのこと。
使っている方は注意。

Generator memory leak when interrupted while the generator is on the stack · Issue #9750 · php/php-src

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

Generator の停止状態で割り込みを入れるとメモリーリークするというイシュー。多分、ほとんどの開発者には関係がなさそう。

修正はこちら

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

extra_named_params の初期化がされていなかったということらしい。

余談

PHP Core Roundup #6 — The PHP Foundation — Supporting, Advancing, and Developing the PHP Language

https://thephp.foundation/blog/2022/09/30/php-core-roundup-6/

PHP Foundation から Core Roundup の第6弾のポストが投稿されました。かんたんにラップアップしますと

  • PHP Parser が 8.2 に対応
  • PHP 8.3 向けの議論が早くも始まっている件
    • 8.3 向けの非推奨の議論
    • json_validate 採択
  • 最近マージされた PR

今週のPHP を見続けている方には、あまり目新しいニュースはないかもしれませんが、非常によくまとまっていていつも助かります。

Discussion