🌀

今週の PHP 2022/09/17 〜 2022/09/23

2022/09/24に公開

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

Internal

Specify abstract parent methods for traits

https://externals.io/message/118650

Trait って、利用する側のクラスの関数を呼び出せるけど、あんまり良いプラクティスじゃないよね?という話題

サンプルを書いてみましたが、空中合体しているようなソースコードになりまして、不安を感じますね。

https://3v4l.org/KkRcm#v8.1.10

いや、でもそれって、abstract メソッドを定義すれば良くないと思ったのだが...

https://3v4l.org/sT2Oh#v8.1.10

この話題を投稿した人は、 #[Override] というアトリビュートを作って、実装を強制仕様ということらしいが、abstract メソッドでも強制させられると思うが...
今の所、投稿者の真意がわかりかねています。

make install overwriting php.ini

https://externals.io/message/118645

make install すると /usr/local/lib/php.ini を上書きされてしまう。困るよ!というご相談。

そうだったっけ?
訓練された PHPer であれば、バージョンによって ini ファイルの場所を変える(コンパイルオプション)、もしくはバックアップを取っておくなどは常識的にやりそうです。

リリースマネージャーさんから、「make install が ユーザーランドの php.ini を上書きすることはない」という返信が来ています。
詳細を教えて下さいという流れ。

Error behaviour for max_input_vars

https://externals.io/message/118614

先週から引き続き、 max_input_vars についての議論。

https://www.php.net/manual/ja/info.configuration.php#ini.max-input-vars

[VOTE] json_validate

json文字列をチェックする関数の RFC です。

議論も収束してきたため、RFC の細かい調整行われて投票が開始されました。
Timさんが、RFC 主を優しくサポートしており、実にいい人だなと思った。

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

事前のコミュニケーションが活発だった上に、RFC主の返信もスムーズだったため、Yes が優勢です。これは入りそう。

PHP: rfc:glob_streamwrapper_support

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

Support するプロトコルは何にするか?などについて、今週も議論が行われています。

全然使ったこと無いせいで、ピンときてませんが scandir などで ftp のプロトコルに対して glob かけたい!みたいなユースケースがあるようです。

Issues with readonly classes

https://externals.io/message/118554

今週も活発に議論が行われています。

Readonlyクラスに可変のプロパティを簡単に生やせるとしたら、そもそも RFC 通ってないと思うよ?というもっともな意見。

Readonly の RFC 作者の意見としては、通常のWebサービスにおける Value オブジェクトとしてイミュータブルなインスタンスを提供したいという素朴な要求に特化したとのこと。
拡張性の提案として clone 時の挙動に関する追加の RFC を出す予定とのこと。

なんとなく、この議論の落ち着き先が決まってきたような気がします。

このイシューを立てた人は、現状の Readonly は完全にぶっ壊れているという主張を展開しているので、ちょっと大丈夫だろうかという感じも。

Tim さんによるナイスなラップアップとしては

  • 現状はデザインされた通りに動いている。(壊れてはいない)
  • 今時点で 8.2 の Readonly の挙動変更は受け入れられない。
  • Timさん個人の考えとしては、継承ツリーからは Readonly の概念が消えたほうが良いというものでした。

RFC [Discussion]: Improve unserialize() error handling

https://externals.io/message/118566

今週も RFC の細かい内容について議論が続いています。
Symfony のユーザー側のコードベースを参考にしつつ話がされています。(時間がなさすぎて、全部は読めなかった....

Set SA_ONSTACK in zend_sigaction External

https://externals.io/message/118687

Go製の新しいSAPIを作っているかたからのお便り。

SA_ONSTACK を使ったシグナルを扱えるようにする PR 出したけど、これ RFC 必要?という話

変更は実に軽微です。軽微だからと言っても、意味が分かるわけではないがな!

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

Master 向けにマージされるようです。

Bugs

parse_url bug in PHP8.2.0-rc1 · Issue #9565 · php/php-src

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

parse_url の不具合ですが、バグ混入のコミットがリバートされて一件落着。

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

Fibers appear to be broken on FreeBSD i386 · Issue #9566 · php/php-src

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

タイトルの通りです。Fiberをstartさせただけで segV が出ています。

すでに修正 commit が出されています。 fiber_asm を使わないという設定になります。(なんのこっちゃ?)

https://github.com/devnexen/php-src/commit/cc2b7e4866dd8ebe1f88654b45fdd0605a9c2499

The behavior of mb_strcut in mbstring has been changed in PHP8.1 · Issue #9535 · php/php-src

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

mb_strcut の不具合修正です。今週は修正コミットが出ています。

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

mb_convert_encoding "" (backslash) and "~" (tilde) BC breaks to Shift_JIS-2004 · Issue #9528 · php/php-src

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

てきめんさん報告の convert 不具合ですが、適切なコミュニケーションが行われたのち、修正の方向に向かってます。

declare random globals by remicollet · Pull Request #9576 · php/php-src

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

なるほど、こうやって、他の ext からの利用可否を判断してるのかというPR

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

session_create_id() fails with user defined save handler that doesn't have a validateId() method · Issue #9583 · php/php-src

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

session_create_id が失敗するというイシューです。

ユーザー定義の Session ハンドラーを利用する場合なので、我々は無関係?なーんてことはなく
主要な WAF は SessionHandlerInterface を拡張している場合が多いので、もしかしたらどこかに大きい影響が出ているかもしれません。

まだ、特に進展がないですが、注視したいイシュー。

preg_match causes Conditional jump or move depends on uninitialised value(s) issue · Issue #9571 · php/php-src

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

PCRE を valgrind を使ってデバッグしている方のイシュー

PCRE を valgrind support 付きでビルドしないと駄目よいうアドバイスのあと、自己解決されてクローズされてしまった....

Replace php_reallocarray with safe_perealloc · Issue #9581 · php/php-src

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

完全には理解できてないけど、様々な環境下でコンパイル可能にするための関数に差し替えたということらしい。
修正コミットは下記で。reallocarray -> safe_peraalloc になっている。
compileタイムの問題なので、ほとんどの人は多分無関係。

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

Fix #78405: FPM with keepalive kills workers after $terminate_timeout by SjonHortensius · Pull Request #8163 · php/php-src

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

keepalive を有効にした FPM において、処理待ちのプロセスがkillされてしまうのを防ぎましょうというPR
修正コミットは来ているが、テストが足されていないので放ったらかしになっています。

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

今週はPR立てた主が、自動クローズされそうになったので
「なんか参考になるテストあったら教えてね」というコメントでした。
(3月頃のPR)

有用な修正だと思うので、なんとか入ってほしい。

Use external diff tool if DIFF_CMD env var is set by derickr · Pull Request #9553 · php/php-src

https://github.com/php/php-src/pull/9553#event-7413806817

DIFF_CMD という環境変数を追加することで、外部の diff コマンドでPHP本体のテスト結果をチェックできるようにしたいという PR
よいことだ。ということで、マージされています。

テストランナーは PHP で書かれているので、修正点がわかりやすい。

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

Added fallthrough for == operator with objects for extensions by JordanRL · Pull Request #7973 · php/php-src

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

1月頃に来ていた PR
== で比較されるときの内部的な関数を拡張側で指定できるようにするというもの。
機能追加だから、RFC 必要なのではと思ったけど、PHP自体の機能性ではなく、拡張製作者用の機能追加だから RFC が不要らしい。
そうなのか?と思いつつ見ている。

Add support for binary, and octal number prefixes for INI settings by Girgias · Pull Request #9560 · php/php-src

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

タイトル通りの内容のPR。
base の判定をしています。

https://github.com/php/php-src/pull/9560/files#:~:text=}-,int base %3D 0%3B,},-zend_ulong retval%3B

A core dump (SIGSEGV) occurs when dl() is used · Issue #9589 · php/php-src

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

8.2RC1 で dl 使って、読み込み済みの共有ライブラリを読み込むと SegV が起きるというイシュー。

これ、8.1系で修正が入っていたやつだと思うので、バックポートされてないのかな???

Float handling changes since 8.0 - on purpose? · Issue #9587 · php/php-src

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

一瞬、IEEE754案件かと思いましたが、var_dump の仕様変更だったようです。

https://3v4l.org/XV2QZ

7.4 では float(548.66) と小数点第二位で精度が止まっています。

8系における互換性のない変更にかかれています。

https://www.php.net/manual/en/migration80.incompatible.php

var_dump() and debug_zval_dump() will now print floating-point numbers using serialize_precision rather than precision. In a default configuration, this means that floating-point numbers are now printed with full accuracy by these debugging functions.

8系からは、 serialize_precision に従った精度で出力されます。

デフォルト設定では precision = 14, serialize_precision=-1 になっているようです。

ini_set を使うことで、デバッグ出力時の挙動は合致させることが可能ですが、serialize したときの挙動が変わるので止めたほうがいいです。
要するに 8系の変更は、var_dump の内容を serialize 時の内容と合わせることで、認知のズレを無くしているという感じだと思います。

https://3v4l.org/bY3v9

Remove superfluous helper variable in Randomizer::getBytes() by joshuaruesweg · Pull Request #9563 · php/php-src

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

ext-Random の細かいコード修正。余分な変数の削除です。
こういう PR でも良いんだなぁ。素晴らしいなぁと思った。

Major overhaul of mbstring (part 26) by alexdowad · Pull Request #9592 · php/php-src

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

オーバーホールの名のもとに、mbstring にガシガシ変更が加わっているぜ!
caseコンバージョンのチューニングだったようです。

これは、マルチバイト文字列圏の人々は、もっと注視していかないといけないですね。

Indirect call reduction for Jit code by wxue1 · Pull Request #9579 · php/php-src

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

どういうことなのか分からんが、1%の速度向上らしいぜ

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

fgetcsv does not read the file correctly · Issue #9600 · php/php-src

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

中国語のCSVファイルに対して、fgetcsv が正常動作しないというイシュー

https://3v4l.org/qSG5D

手元でも試したけど、正常に動いているようにみえる。とりあえず CRLF も試したけど同じ。

Windows + PHP 7.4 でのみ発生しているらしい。再現環境がない....

Discussion