🦁

PHP8.0にアップデートする際にmonologのバグを踏んだ

2022/12/23に公開

この記事はコネヒトアドベントカレンダー2022の14日目の記事です。

monologはPHPでロギングをする際のデファクタスタンダードだと思いますが、最近あるプロジェクトをPHP8.0にあげる際にmonologのバグを踏んだので少し紹介します。

monologのPHP8対応

monologがPHP8に対応したのはchangeLogを見てみると2.1.0にAdded tentative support for PHP 8と書いてあるので2.1.0で暫定的にPHP8に対応しています。

PHP8.0に上げたいプロジェクトのmonologのバージョンが1.26と大分古いバージョンなのでとりあえず2.1.0にあげてみました。

そして動かしてみたら下記のエラーが

The UdpSocket to hostname has been closed and can not be written to anymore

調べてみたらissueを発見

https://github.com/Seldaek/monolog/issues/1519

PHP8.0では$socketがresource型ではなくSocket型も返却される可能性があるので以下の書き方だと正しくSocketのインスタンスが作成されていてもif文の中に入ってしまってエラーが発生していました

if (!is_resource($socket)) {
	throw new RuntimeException()
}

どうfixしたのか

instanceof構文でSocket型の場合も調べています

if (!is_resource($socket) || $this->socket instanceof Socket) {
	throw new RuntimeException()
}

https://github.com/Seldaek/monolog/commit/fd305da67bdbda519979e8de52599376788d57f1

この変更が取り込まれているバージョンにまであげたら無事正常に動作しました。

いつかこういうOSSのバグをいち早く発見してコントリビュートしたいです

Discussion