PHP phar拡張モジュールの素敵な仕様

久しぶりにやってくれたPHP。
気づかず同じところに引っかかる人が出ると思ったので書いておきます。

今回PHPで.tar.gz圧縮/解凍を実装することになりまして、
phar拡張モジュールが対応しているということなので、素直にこれで実装したところ動作確認中にエラーが発生しました。

再現のための最小コードがこちらになります。

PharDataは内部でファイルパスをキーとして静的な領域にデータをキャッシュする実装になっているようで、上記のように同じファイルパスだと、複数PharDataを作成しても同じデータを指すことになり、2回目のcompressを実行しようとしたタイミングで「それはもう有るよエラー」ということです。

逆に以下のようなコードで1つのファイルを複数のPharDataで操作出来ます(意味は無い)

この現象については報告されていたのですが、ソースとかディスカッションを見るに
意図して実装されており、良い悪いは別として仕様な気がします。

https://bugs.php.net/bug.php?id=75101

1処理中に同じファイルパスで複数回ファイルを作り直すみたいなのはレアケースだと思うので遭遇する確率は低いと思いますが、記憶の片隅に留めておくとよいと思います。

WordPressのデフォルトアバターが表示されない(404エラーになる)問題

WordPressでデフォルトのアバターを表示させると、以下のようなGravatarのURLを生成します。

https://secure.gravatar.com/avatar/?s=60&d=mm&r=g

このURLが2023年8月9日現在404エラーとなっています。

次のようにパラメータの順番を変更すると正常に表示されます。

https://secure.gravatar.com/avatar/?s=60&r=g&d=mm

さすがにこれが仕様ということは無いと思うので、何かしら不具合が発生していると思われます。

Gravatarにお知らせしたいのですが、不具合を報告したり、お問い合わせするようなフォームが見つけられなかったので諦めました。

Gravatarの中の人ー!見てたら直してくれー!

Workaroundとしては、WordPressが生成するURLのパラメータを並べ替えることが考えられます。

以下のようにURLの生成箇所に用意されているフィルターでパラメータを並べ替えればよいでしょう。

Gravatarが修正されるまでの一時的な物なのでプラグイン化するほどではないかなと思います。

お使いのテーマのfunctions.phpに入れればよいのではないでしょうか。

httpd 2.4.33のmod_sslでLibreSSL 2.7以上を使うときのパッチ

httpdのバージョンが上がったらそのうち対応されて直ると思いますが
それまでは使えると思うのでメモっておきます。

具体的には次のようなエラーがでた場合の対処です。

LibreSSLのopenssl/dh.hでDH_set0_pqgが宣言されているのに
mod_sslのssl_engine_init.cでDH_set0_pqgがstaticで実装されていて合っていないというエラーです。

このDH_set0_pqgという関数はOpenSSL1.1未満では実装されていないため、
mod_sslはOpenSSLが1.1未満の場合に自前の実装を使うようになっています。

プリプロセッサ的にはMODSSL_USE_OPENSSL_PRE_1_1_APIがONになっていれば
mod_ssl側でDH_set0_pqgを実装する形です。

このMODSSL_USE_OPENSSL_PRE_1_1_APIはLibreSSLを使うとONになるようになっているため
DH_set0_pqgが実装されたLibreSSL 2.7以降と合わせると不整合という状態になってしまいます。
(LibreSSLは基本的にOpenSSL 1.0.1ベースだが、LibreSSL 2.7でOpenSSL 1.0.2や1.1.0の機能がいくらか追加された)

対処としてはmod_ssl側の実装を削除してしまうだけです。

mod_sslとLibreSSLでは微妙に実装内容が違うのですが、きっとLibreSSL側の実装の方が信用できる。
mod_sslの方が信用できるよ派の人はssl_engine_init.c内のDH_set0_pqgを適当にリネームでもすればよいと思います。

あと私はApacheよりNginx派です。