🙌

【FrankenPHP・ZTS】スレッド安全を考慮して、PHP拡張機能を追加する

に公開

概要

こんにちは、Booostのバックエンドエンジニアのma_meです。
今回はFrankenPHPの環境構築時に意識すべき、PHPのスレッド安全性について紹介します。

PHPにはスレッド安全かどうかを切り分けた2つのビルドがあります。

  • NTS(Non Thread Safe):スレッド安全でないビルド
  • ZTS(Zend Thread Safe):スレッド安全なビルド

FrankenPHPはZTSで構築されているため、
拡張機能のインストール時にはこのビルドモデルの意識が大切になってきます。

Xdebugの一般的なインストール方法と問題点

Xdebugを例にあげて説明します。
良くある方法として、Xdebugをapt から導入しました。

RUN apt install php-xdebug

ただこれではFrankenPHP(ZTS)の環境では動作しません。
aptではNTS・ZTSの違いを考慮せず、NTSバージョンをインストールしてしまうからです。
同様のことがpeclを利用したインストール時にも発生します。

対処方(install-php-extensionsを利用する)

install-php-extensionsを使ってインストールしましょう。

RUN install-php-extensions xdebug

このユーティリティは現在のPHP環境(ZTS/NTS、バージョン、各種設定)に合わせてソースから拡張をコンパイルします。
そのため、環境固有の不整合を回避しつつ、確実にZTS対応版を導入できます。

https://github.com/mlocati/docker-php-extension-installer

まとめ

FrankenPHPはZTSビルドのPHPランタイムであるため、拡張機能のインストールにはビルドモデルを意識する必要がありますが、
install-php-extensions を活用することで、環境に合わせたソースコンパイルが行われ、確実にZTS対応版を導入できます。
Dockerイメージの品質と安定性を高めるために、積極的に利用していきましょう。

Booost

Discussion