今週の PHP 2023-01-14 〜 2023-01-20
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 に上げておきましょうという相談。
これは、大賛成です。
コンテナを使うのが当たり前の時代なので、これで困る現場も少なそうです。自前でビルドして使っている人たちは多少影響がありそうです。
[RFC] Add SameSite cookie attribute parameter - Externals
SameSite の Cookie 属性パラメーターを追加することに関する RFC コメントスレッドです。
https://wiki.php.net/rfc/same-site-parameter
PoC もあります。
提案内容をまとめると、下記の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
opcache
の huge_code_pages
オプションを削除しようという PR
まとめると、このオプションがあるとメモリ上に無駄にキャッシュを乗せてしまうので、スワップが発生しやすいなどの欠点があるらしい。
PR の元になっているイシューはこちら
こちらでは、まずオプションをデフォルトで 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 です。
Discussion