Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

PHPerKaigi 2026で「PHP 7.4でもOpenTelemetryゼロコード計装がしたい!」という発表をしました

iwillblog -> I've blogged!

2026-03-20(金)〜2026-03-22(日)の3日間で開催されたPHPerKaigi 2026に登壇者として参加しました。

自分で写真をほぼ撮らなかったので、登壇時に撮影いただいたものを……

https://x.com/yasunori_k_/status/2034940972082315586

発表内容

Day 0に「PHP 7.4でもOpenTelemetryゼロコード計装がしたい!」というタイトルで40分トークをしました。

speakerdeck.com

OpenTelemetryのゼロコード計装がPHPに対して用意されており、PHPのアプリケーションではコードを編集することなくトレースを出力させることができます。これはPHP 8でZend Engineに追加されたObserver APIによって実現されています。OpenTelemetry拡張モジュールは、任意の関数を指定して前後にフック処理を登録する関数を提供します。自動計装ライブラリは、拡張が提供するフック登録関数を利用して、フレームワークやライブラリごとの主な関数に対してテレメトリーを計装する処理を加えていきます。PHPのオートロードの仕組みで登録処理が自動で行われるため、結果として、OpenTelemetry拡張モジュールのインストール+composerによる自動計装ライブラリinstallだけでゼロコード計装が実現されるというわけです。

PHP 7.4以前ではObserver APIが使用できないため、これらのバージョンではOpenTelemetry公式のゼロコード計装の仕組みは使用できません。しかし、理屈としては関数にフックを仕掛ける仕組みさえあればゼロコード計装できるはずです。そこで、PHP 7.4でも使える zend_execute_ex 関数ポインタを置き換え、元の処理をwrapし前後に任意の処理を追加できるようにする拡張モジュールを自作しました。また、この拡張モジュールに合わせた自動計装ライブラリもまた自作しました。発表中では、実際にPHP 7.4+Laravel 8のアプリケーションに対して自作したゼロコード計装の仕組みを導入するデモを行い、Jaegerでトレースが閲覧できることを確認しました。

作成したPHP拡張モジュール・ライブラリのソースコードは以下のリポジトリで公開しています。今後、他の人も簡単にPHP 7.4向けのOpenTelemetryゼロコード計装を導入できるように、拡張のパッケージ提供やライブラリのPackagist登録などを進めていく予定です。

github.com

参加した感想

膝を怪我していたり頭を怪我していたりスマホを壊したりと散々なコンディションで、現地には多くの時間滞在できなかったのですが、短い間ながらも初めてのPHPerKaigiを楽しませてもらいました。特にLTが演出も発表内容も非常によかったですね。

私のセッションがPHP 7ネタだったのですが、あるスポンサーブースの企画で、PHP 7系のユーザーが現在もそれなりにいることを改めて把握しました。アップデートできることを祈りつつ、なかなか上げられないレガシーアプリケーションにもオブザーバビリティを提供できるように今後もやっていくぞ!という気持ちになりました。

「廊下」や懇親会で多くの方とお話しさせていただきました。自身の発表を聞いてくださった方々からも話しかけていただき、見た目で覚えてもらえるのは得だな〜と思いました。大吉祥寺.pm 2025での私の発表「【実演版】カンファレンス登壇者・スタッフにこそ知ってほしいマイクの使い方」を見直していたという登壇者の声も多く聞けてよかったです。

飲み物調達数のヨミが完璧だったのも印象に残っています。クロージングで言われていた通り、やはりオブザーバビリティは大事ですね。(これはどちらかというモニタリングの領域な気はしてます。ビールの消費推移が分かっても、それがなぜか?までは踏み込めないと思うので。)

懇親会後は3次会まで高円寺で飲んだ後、中野に戻って野生のPHPerを探しつつ、見つけられなかったので撤収しました。スマホなしで探すのが無理ゲーすぎて。

来年も開催されるならぜひ参加したいです。

2次会の質問に答えるコーナー

2次会で id:o0h さんに、「Xdebugって遅くなるから本番環境での利用が推奨されないけど、Observer APIをXdebugでも使っていい感じにできるんじゃないか?」と質問いただきました。私は現役PHPerではないのもあってその場ではちゃんと答えられなかったので調べてみました。

Xdebugのソースコードを読んだのですが、v3からObserver APIを用いる実装になっているようです。zend_execute_exを用いる旧来の方法ではPHP 8のJIT下でキャプチャできないことがあるため、必然かもしれません。

static zend_observer_fcall_handlers xdebug_observer_init(zend_execute_data *execute_data)
{
    return (zend_observer_fcall_handlers){xdebug_execute_begin, xdebug_execute_end};
}

src/base/base.c#L1066-L1069

XdebugはすでにObserver APIを用いているため、Observer APIを用いることによるパフォーマンス最適化の余地はない、というのが質問への回答になります。

次回予告

次のカンファレンス参加は、2026-04-11(土)に開催されるPHPカンファレンス小田原2026の予定です。コアスタッフとして皆さまの参加をお待ちしております。

phpcon-odawara.jp

また、次のカンファレンスの登壇は、2026-05-14(木)・2026-05-15(金)に行われるクラウドネイティブ会議の予定です。今回もオブザーバビリティネタで、「ユーザー体験を可視化する非同期処理の分散トレーシングとSLI計測:ジョブキューを跨ぐコンテキスト伝搬の仕組み」について話します。全員来てください。

kaigi.cloudnativedays.jp