🦁
PHP8.0にアップデートする際にmonologのバグを踏んだ
この記事はコネヒトアドベントカレンダー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を発見
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()
}
この変更が取り込まれているバージョンにまであげたら無事正常に動作しました。
いつかこういうOSSのバグをいち早く発見してコントリビュートしたいです
Discussion