😺

今週の PHP 2023-01-14 〜 2023-01-20

2023/01/29に公開

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

Internal

[RFC] Add file_descriptor() function - Externals

stream のファイルディスクリプタを取得する関数 file_descriptor を追加しましょうという RFC のコメントスレッドです。

https://wiki.php.net/rfc/file-descriptor-function

FFI を使うことで、Zend Engine 側しか知り得ないファイルディスクリプタを表に持ってくるというコードが紹介されています。

https://github.com/ppelisset/php-fileno

まあ、これが出来るんだから、PHP の関数としてサポートしてあげようよという話ですね。

  • DIO 拡張で十分ではないのですか?
  • ファイルディスクリプタが露出されて、直接使われると今まで起きなかった類のエラーが出る
  • USB デバイスで便利に使えると書いてあるけど、サンプルコードを載せてほしい

などなどです。

個人的には、この種の低レベルものは、追加されたところで、一般利用はされないので、プロ向け関数として追加するのは良いのではと思いました。

PHP 8.1 and OpenSSL - Externals

PHP 8.2 の公式ビルドは、 OpenSSL 3.0 が使われています。

問題は、 PHP 8.1 系でして、OpenSSL 1.1.1系が使われています。こいつは、サポート期限が 2023-9-11 なので、 PHP 8.1 のサポート期限より短い。
というわけで、PHP 8.1 の公式ビルドも OpenSSL 3.0 に上げておきましょうという相談。

これは、大賛成です。

コンテナを使うのが当たり前の時代なので、これで困る現場も少なそうです。自前でビルドして使っている人たちは多少影響がありそうです。

SameSite の Cookie 属性パラメーターを追加することに関する RFC コメントスレッドです。

https://wiki.php.net/rfc/same-site-parameter

PoC もあります。

[RFC] Add SameSite parameter to cookie setting functions by Girgias · Pull Request #10317 · php/php-src

提案内容をまとめると、下記の3つの関数に対して enum SameSite を引数として追加するものです。

  • setcookie
  • setrawcookie
  • session_set_cookie_params

いやー、気持ちはわかるんだけど、この増やし方していくと、どんどんオプション引数増えちゃうよねぇ。
Cookie オプション型みたいなものを用意して、それを引数として受取るようにしたらどうかなぁ。

RFC に対するコメントは、下記

  • SameParty, Partitioned っていうオプションについて、最近語られているけど、スコープに入れませんか?
  • PHPコアの列挙型にした場合、新しい値が追加されると、新旧PHPで、動作するコードを書くのが難しくなる
  • 今までの属性値と違って、option ではなく Enum で表現されると一貫性がない。正しいことは認めるが。

という感じで、Cookie というウェブの重要な仕組みに関連する提案なので、議論が白熱しています。
PHP 7.3 以降で使える setcookie(string $name, string $value = "", array $options = []): bool というシグネチャーは、確かに文字のタイプミスなどが発生しやすいので、Enum は良い考えだとは思いますが、この関数はそんなに使わないよなというのも事実なので、この RFC が受け入れられるには、もう少し軌道修正が必要な気がします。

Measuring Proposal Reaction - Externals

STDOUT STDERR グローバル定数を常に定義しようという提案です。

現在では、CLI で起動された場合にこれらの定数が定義されます。

https://www.php.net/manual/ja/features.commandline.io-streams.php

こんなコードを実行すると。

<?php

echo STDIN . PHP_EOL;
echo STDOUT . PHP_EOL;
echo STDERR . PHP_EOL;

リソースIDが下記のように、出力されます。

Resource id #1
Resource id #2
Resource id #3

ファイルディスクリプタの順番に割り当てられているなというのがわかります。ちなみに Resource id はファイルディスクリプタとは異なります。

要するに、これを CLI 以外でも使えるようにしたいという話です。

反応としては、下記のような感じで、あまりみんな積極的ではなさそう。

  • すでに STDOUT/STDERR が存在するかどうかで、CLI かどうかを判定するコードがありそう
  • php://stdout で使えるんだからいいじゃん

Bugs

`mb_detect_encoding()` detects UTF-8 emoji byte sequence as ISO-8859-1 since PHP 8.1 · Issue #7871 · php/php-src

mb_detect_encoding が PHP 8.1 以降、emoji を ISO-8859-1 と誤診しているというイシュー。

昨年のイシューですが、最近コードポイントの修正があったので、こちらのイシューも動き出しました。

ext/mbstring/common_codepoints.txt つまるとこと、コードポイントとしてなにを見つけたら UTF-8 と判断するかというのが問題です。

ext/opcache: remove option huge_code_pages by MaxKellermann · Pull Request #10301 · php/php-src

opcachehuge_code_pages オプションを削除しようという PR

まとめると、このオプションがあるとメモリ上に無駄にキャッシュを乗せてしまうので、スワップが発生しやすいなどの欠点があるらしい。

PR の元になっているイシューはこちら

php.ini: disable opcache.huge_code_pages by default, clarify documentation by MaxKellermann · Pull Request #10336 · php/php-src

こちらでは、まずオプションをデフォルトで disabled にしつつ、ドキュメントをきちんとしようという内容

問題となるケースは、一つのPHPファイルからたくさんのプロセスをフォークするような場合なので、いわゆる普通のPHPアプリケーションは、問題になりづらい気がします。

ただ、FrankenPHP のように PHP 自体がステートフルに動作するパターンにおいては、問題が大きくなりそう。

"Cannot instantiate" from|trait|abstract class from · Issue #9675 · php/php-src

たまに、下記のエラーが出て具象クラスの生成に失敗するエラーがでるというイシュー。

  • "Cannot instantiate interface from"
  • "Cannot instantiate abstract class from"
  • "Cannot instantiate trait from"

去年の10月に上がっていたイシューで、なにがしかのメモリー上の問題と言われていたやつですが、公式に対応されて 8.2.2 で Fix です。

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

Enum クラスにおける run_time_cache の問題だったのですねぇ。非常に小さい修正です。

関連して、こちらも close になりました。Enum で、この問題が起きている方は要チェックです。

Potential crash in enum tryFrom() with observers · Issue #10346 · php/php-src

Update year to 2023 by petk · Pull Request #10374 · php/php-src

くぅぅぅ〜。こういう PR を狙っていきたいw

Add `max_object_properties` parameter for `json_decode()` · Issue #10376 · php/php-src

json_decode に オブジェクトのプロパティ最大数を指定するパラメーターを追加しようという話。

大きすぎる JSON ファイルを入力として与えられた際の例外的な挙動を制限しようというものです。良さそう。

mb_detect_encoding is more accurate on strings with UTF-8/16 BOM by alexdowad · Pull Request #10373 · php/php-src

mb_detect_encoding の精度をあげようという PR

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

絵文字が ISO-8859-1 に誤判定される問題を受けた対応です。

Unable to have an anonymous readonly class · Issue #10377 · php/php-src

readonly な無名クラスを作れないというイシュー。確かに作れない。というわけでバグとして扱われています。

修正内容は下記の PR です。

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

Discussion