PHP
PHPExtension
闇PHPDay 19

動作中のPHPがZTSかNTSか判定する方法

More than 1 year has passed since last update.

タイトルの通り、一部の人にだけ便利なPHP情報をご紹介します。

ZTSとは

ZTS (Zend Thread Safe) は、マルチスレッド環境に対応するためのPHPの機構です。

マルチスレッド環境では、同じメモリ領域を複数のスレッドが共有します。複数のスレッドが同時に一つのリソース(たとえばグローバル変数)を読み書きする可能性があるので、シングルスレッド環境とは異なるプログラミングが必要になります。マルチスレッド環境で安全に動くようなプログラムのことをスレッドセーフと呼びます。

つまり、ZTSというのはPHPのスレッドセーフ実装ということになります。

とはいえ、PHPはシングルスレッド環境で動かす方が一般的です。LinuxやMacOSXなど、多くの環境のPHPがNTS (Non Thread Safe) で動作しているはずです。ZTS動作が必要なのはWindows+IIS環境くらいでしょう。

ZTSかどうかはPHPのビルド時に決まります。何かの理由で両方を比較したい場合はPHPのバイナリまたは共有ライブラリを2種類用意する必要があります。

ZTSかNTSかをPHPプログラムから判断する

このZTS/NTSについて、今どちらのモードで動いているかPHPプログラムから知りたい場合は、定数PHP_ZTSで調べることができます。1ならZTS有効、0なら無効です。

念のため補足しておくと、PHPプログラマの目線ではZTSでもNTSでも同じPHPプログラムが同じように動くはずなので、ZTSかNTSかはそれほど重要ではないはずです。

どういうときに便利か

ZTSかNTSかでPHPプログラムは影響を受けないと書きましたが、PHP拡張モジュールの場合は別です。僕はNTS環境でしか期待通りに動かない拡張モジュール(hnw/php-strdumper)を書いたので、そのテストコードでZTSかNTSかを調べたかったんです。

まさに俺得情報ですね。

おまけ

他にもPHP_DEBUGという定数も見つけました。これを使えばPHPが--enable-debugつきでビルドされているかどうかを調べられます。これらの定数はPHP5.2.7以降で使えます。

参考URL