今週の PHP 2023-02-18 〜 2023-02-24
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
Windows PECL build machine died - Externals
以前にもご紹介した Windows の PECL ビルドマシーンが死んだという話。
cmb さんが引っ張っていた話だけに、沈黙期間が生まれています。ping 的なコメントが入りましたが、とくに進展もなく...... どうなるのだろう......
一応、以前までの話だと
- Github Actions でビルドできるよ
- でも、それだとタイミング的に異なる環境でビルドされるパターンが出る
- 僕、使えるマシーン持ってるよ。提供するけど?
- 数ヶ月の沈黙
こんな流れです。
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
は、第一引数の文字列が、第二引数のエンコーディングで有効なものかどうかを調べるものです。
例にもある通り、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_close
を proc_get_status
を行ったあとに実行すると、必ず -1
が帰ってくるというイシュー。
不具合ということで、修正の流れに。
Discussion