😽

今週の PHP 2023-03-04 〜 2023-03-10

2023/03/13に公開

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

Internal

RFC Idea - json_validate() validate schema - Externals

json_validate 関数は、JSON の妥当性チェックを行う関数で、PHP8.3 で導入されます。

このお便りは、json_validate にオプションを追加して、JSON Schema も使った妥当性検証も出来るようにしようというものです。

こんな感じのシグネーチャー

json_validate(string $jsoJn, int $depth = 512, int $flags = 0, string $json_schema = null): bool

string か、そうか、そうだよね......

反応としては、概ね好意的です。ユーザーランドで実装されている人たちからは、コアに入ってくれることが嬉しいという反応が多いです。

話としては盛り上がっていて、異なるバージョンの JSON Schema を内包できるようにするために JsonSchema クラスを作ったらどうか?などの案もでてきています。

きっと、そのうち RFC が出てくると思います。

Release Managers for PHP 8.3 - Externals

PHP 8.3 のリリースマネージャー募集の件

立候補される方は

  • Cの第一人者である必要はないが、内部のことをよく理解していること
  • バグのトリアージ、後方互換性チェックなどできること

が求められています。ドキュメントも豊富らしいので、支援はたくさん受けられるようです。

申込みの締め切りは 3/31 12:00 UTC で 選挙は 4/1 〜 4/16 の予定です。

Two Issues regarding Named Parameters; want to understand the technicality - Externals

名前付き引数利用に関する相談のお便りですが、ちょっと自分には何を意図した質問なのかがわかりませんでした。

名前付き引数の挙動に関するものだとは、思うのですが、例に挙げられているコンストラクタは、一方が int で、他方が string だったりするので、名前付き引数以前に型で怒られそうです。。

PHP: rfc:saner-array-sum-product

Vote が終了し、27 対 0 で可決されました。array_sum, array_product は型安全になります。めでたし。

Bugs

setcookie() negative timestamp · Issue #10765 · php/php-src

setcookie で負のタイムスタンプを設定すると Unixエポック(1970年1月1日)に失効するクッキーになるというイシュー

ランタイムエラー が妥当であろうという方向で、すでに対応も終わっているようです。細かい調整が済めばクローズされそうです。

mb_encode_mimeheader($str, "UTF7-IMAP", "Q");

Null ポで SegV がでていたようです。手元の PHP 8.2.4 でも再現しました。

<?php
mb_encode_mimeheader($str, "UTF7-IMAP", "Q");

おそらく、この関数を使っている現場は多くないと思います。
8.1, 8.2 には修正が入っています。

Internal exceptions may misinterpret the null byte \0 · Issue #10810 · php/php-src

Null 文字 "\0" を例外メッセージに混入すると、以降の文字列が消え去るというイシュー。

<?php
throw new \Exception("Hello\0World");

Null 文字は、C言語における文字列の終端文字なので、内部処理のどこかで不適切な取り扱いがあったのだと思われます。

出力としては、Null文字が削除されている or Null文字がエスケープされている ことが望ましいという提案です。

Named arguments in CTE functions cause a segfault · Issue #10801 · php/php-src

CTE -> Compile Time Eval の略でした。

テスト時設定のようですが、SegV を起こしているので、修正されたようです。略語は難しいね。

関連イシュー

Disable opcache.consistency_checks by nielsdos · Pull Request #10798 · php/php-src

php.ini の opcache.consistency_checks が 0 以外の場合に、php-fpm でメモリーリークが発生するという件です。PHP 8.1.5 以上で発生しています。

この PR は 上記設定が 0 以外の場合に、強制的に 0 に戻してしまうことで無効化するというものです。現状、上手く動かない理由がよくわかってないようなので、ひとまずの暫定対応ですね。

とはいえ、元イシューがクローズされちゃったけど、いいのかな...

session_regenerate_id with custom handler and use_strict_mode generates three new session ids · Issue #10807 · php/php-src

Session のカスタムハンドラー関連の不具合報告です。 session.use_strict_mode=1 を指定すると、Session ID が3回ジェネレートされるというものです。

Session ID 生成周りの While 文の離脱条件がおかしいようです。

[Feature Request] Function to generate UUID · Issue #10808 · php/php-src

UUID おそらく v4 を生成する PHP の関数を作ろうぜというもの。RFC 作ってね案件になりました。

Using null coalesce operator seems to loose reference · Issue #10825 · php/php-src

Null 合体演算子を使うと、配列のリファレンスが無くなるというイシュー

https://3v4l.org/gpAOM

一瞬、よくわからないですが、要するに foreach の配列の箇所に Null 合体演算子を使うと &$value のリファレンスが元の配列とは異なるものになっているということです。

これは、そもそも意図された挙動なので、イシューとしてはクローズされました。普通にコードレビューとかでこういうコード出てきたら、わからないなぁと思いました。そもそも、破壊的変更するなという話ではありますが。

Different diff->days between php 8.0.28 and php 8.1 · Issue #10822 · php/php-src

8.0 系と 8.1 系 で Datetime クラスの diff 結果が変わっているというイシュー。

イシュー説明文の例より、分かりやすいので、コメントにあった方の例を貼っておきます。

https://3v4l.org/O9u7D

こちらですが、Daylight Saving Time 問題でした。例えば、 Asia/Tokyo を指定すると、バージョンをまたいでも一定です。

https://3v4l.org/PhMch

3v4l の Timezone は Europe/Amsterdam なので影響を受けていたようです。ちなみに 8.1 系で修正が入ったものなので、正しい結果は 1 です。

8.0 はもはや security fix しか入らないので、ヨーロッパのタイムゾーンを使うアプリの場合は 8.1 以上にすることで、一定した結果が得られるようになります。

Discussion