今週の PHP 2023-02-18 〜 2023-02-24

2023/03/04に公開

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

Internal

Windows PECL build machine died - Externals

以前にもご紹介した Windows の PECL ビルドマシーンが死んだという話。

cmb さんが引っ張っていた話だけに、沈黙期間が生まれています。ping 的なコメントが入りましたが、とくに進展もなく...... どうなるのだろう......

一応、以前までの話だと

  1. Github Actions でビルドできるよ
  2. でも、それだとタイミング的に異なる環境でビルドされるパターンが出る
  3. 僕、使えるマシーン持ってるよ。提供するけど?
  4. 数ヶ月の沈黙

こんな流れです。

What's the purpose of zend_result? - Externals

PHP のソースコード内にある zend_result は何の目的で存在してるの? bool で良くない?というお便り

nikita さんからの返信が明確でわかりやすかったです。

Any type that has only two values is isomorphic to a boolean. However, for us humans, not all two-valued types are semantically equivalent.
If you have a function like zend_hash_exists(), true and false are directly meaningful values.
If you have a function like zend_stream_open_function(), SUCCESS and FAILURE are directly meaningful values.
Now, if you make zend_stream_open_function() return a boolean instead, it's no longer clear what the return value means. Does a true return value mean that the stream was opened successfully, or that it failed?

C言語における bool は 0 か、0ではない負の数です。 zend_result はそれを明確な2値として扱えるようにしている抽象です。(あっているはず)

マックスさんのおかげで、当たり前に思ってしまう様々なことに知見が溜まっていくので、私としては嬉しいです。

[RFC] [VOTE] Saner array_(sum|product)() - Externals

「気の確かな array_sum, array_product」 について、投票が開始されました。

https://wiki.php.net/rfc/saner-array-sum-product

現状では満場一致です!これは、入りそう。気が確かになりそうです。

Class Re-implementation Mechanism - Externals

クラスの再実装メカニズムについての提案です。

とある final class があって、それに依存したテストを書かなければならないが、 final class をそのまま使うのがしんどいパターン。

通常だと、とある final class の interface を作成して、interface に依存するように利用する側を修正すればいいのですが、それって煩わしくない?という話。

そこで、クラスファイルに

final class interface C {}
final class D implements C {}

こんな風に併記できたら、楽になるよね。と

実際、自分もテストの時に、内部クラスとか使おうとしたことあるのですが、 PSR-4 で禁止されている行為なので、出来ないのですよねぇ。

実際に、internals でも、その件について指摘が入っています。

コメントでは、一時的に final を消し飛ばすライブラリーについても触れられていて、面白いです。

https://github.com/dg/bypass-finals

問題がテスト実装にあるのであれば、一時的に final 吹き飛ばしたり、 Mockery 使うのでも構わないかなと思います。個人的には、面倒臭がらずに interface 作ったほうが、結局構造がシンプルになって良いと思いますが。

LDFLAGS broken? - Externals

マックスさんからのお便り

CI が失敗していて、原因は LDFLAGS の unset にあるらしいので、直すよ?という話。

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

修正内容は簡単ですが、過去にも直そうとして、もとに戻されて、みたいなことを繰り返していて、かつコミットメッセージが不十分ということで、マックスさんオコでした。私も、これは良くないなと思いました。

Bugs

php 8 - exit() takes a very long time to send response · Issue #10620 · php/php-src

バージョン 8 になってから、同じコードが正しく exit しないんだがというイシュー。
調べていくと、exit そのものの問題ではなく libxml2 のバージョン違いによって、simplexml_load_file の挙動が変わっているのでは?という話に発展しています。

今後が気になるイシュー

mb_convert_encoding crashes PHP on Windows · Issue #10627 · php/php-src

Windows において、 mb_convert_encoding がエラーになるというイシュー

古典的な NULL 問題だったようです。修正内容を見ると Windows 以外でも発生しそうです。 auto 選択した際に発生するということらしいので、8.x 系使っている人は注意

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

curl responses mixed up with pcnt_fork · Issue #10633 · php/php-src

pcontl_fork を使って、それぞれのプロセスから curl を利用した場合に、それぞれのプロセスでの curl レスポンスがミックスされてしまうというイシュー

どうやら問題は curl が異なるプロセス間のレスポンスを食い合っていたことらしい。PHP の書き方で解決できる問題では無さそうということだけがわかっています。curl 拡張の問題であれば、なんとかなりそうですね。

サンプルコードでは、それぞれのプロセスで curl_init しているのですが、それでもステートレスに使うことが出来ないとすると、結構厳しいですね。

これ、ステートフルな PHP を作ろうとする人たちからすると、原因と対策をはっきりさせたいところであろうと思います。

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

Readonly な無名クラスが作れなかった問題、次のリリースで使えるようになりそうです。やったね。

Segfault when using opcache and JIT · Issue #10626 · php/php-src

psalm の人からの opcache と JIT で SegV おきているよの報告。すでに、修正されている件のようなので、イシュー自体はクローズされました。

この系のイシューをちょくちょく見るので、JIT は OFF で運用したほうがいいのではと思ってしまいますね......

mb_check_encoding() returns true for incorrect but interpretable ISO-2022-JP byte sequences · Issue #10648 · php/php-src

mb_check_encoding が正しくないバイトシーケンスに対しても true を返すという報告。

そもそも、mb_check_encoding は、第一引数の文字列が、第二引数のエンコーディングで有効なものかどうかを調べるものです。

https://3v4l.org/9i19F

例にもある通り、8.0 系と 8.1, 8.2 で挙動が変わってしまっています。

alex さんも書かれていますが、 mb_string のオーバーホールにおいて、テキストエンコーディング変換と、テキストエンコーディングの妥当性検証が統合された結果とのことです。

この方向性は変えずに、 mb_check_encoding, mb_detect_encoding に修正を入れるという方針で修正が進んでいくようです。

pakutoma さんは、mb_string 系のイシューをよく上げてくれていて、素晴らしいなぁと思います。

もう一個のイシューは、歴史的経緯ということでクローズになってました。
https://github.com/php/php-src/issues/10651

alex さん優しいなぁ

proc_close after proc_get_status always returns -1 · Issue #10239 · php/php-src

proc_closeproc_get_status を行ったあとに実行すると、必ず -1 が帰ってくるというイシュー。
不具合ということで、修正の流れに。

Discussion