| ユーザフォーラムで議論/質問 | マニュアル検索 | ハイライト | ハイライトオフ | ポータル | php spot |
スレッドセーフなリソースマネージャスレッドセーフを有効にして PHP をビルドするときには、エンジン内で個々のコンテキストを分離する方法が必要になります。 つまり、プロセス内の各スレッドが、互いに影響を及ぼさずに個別のリクエストを処理できるようにするということです。 TSRM は PHP における全能の神です。拡張モジュールの作者は、ほとんど何もしなくても、 自作のモジュールをスレッドセーフ環境と非スレッドセーフ環境の両方に対応させることができます。 例1 モジュールグローバルへのアクセス用マクロ #ifdef ZTS #define COUNTER_G(v) TSRMG(counter_globals_id, zend_counter_globals *, v) #else #define COUNTER_G(v) (counter_globals.v) #endif このコード片は、拡張モジュールの作者がグローバルアクセサ?を定義する方法を示すものです。 TSRMG マクロは、識別子と型キャストそして要素名を受け取ります。 識別子は、モジュールの初期化時に TSRM が代入します。 グローバルアクセサをこのように宣言しておくと、その拡張モジュールは、 スレッドセーフと非スレッドセーフのどちらのアーキテクチャでも同じロジックで安全に扱えるようになります。 TSRM は、PHP 内部のすべてのグローバル構造 (実行環境のグローバルから拡張モジュールのグローバルまで) の分離や安全性を管理し、隔離したストレージへのポインタをほとんどの API 関数に渡します。 TSRMLS_C と TSRMLS_CC の二つのマクロは、それぞれ "thread safe local storage"、"thread safe local storage prefixed with a comma" を表します。 関数で TSRM へのポインタが必要な場合は、マクロ TSRMLS_D あるいは TSRMLS_DC を関数のプロトタイプで使います。 これらはそれぞれ、"thread safe local storage only" と "thread safe local storage prefixed with a comma" を表します。 エンジン内のマクロの多くは TSRM を参照しているので、ほとんどの場合、TSRM を受け付けるようにしておくほうが得策です。 そうしておけば、もし TSRM を利用することになったとしても、実行中にポインタを取得する必要がなくなります。 TSRM はスレッドローカルであり、中には互換性の関係で TSRM を直接使えない関数もあります。 そのため、TSRMLS_FETCH マクロが用意されました。これは、TSRM にスレッドローカルストレージへのポインタを取得させるようリクエストします。 可能な限り、このマクロは使わないようにしましょう。スレッドセーフ環境では、実行のコストがかかってしまうからです。
これ以降で説明する機能は、TSRM を高度に使いこなすためのものです。 普通は、拡張モジュールが直接 TSRM を操作することはありません。 拡張モジュールのプログラマーは、TSRM の上位にある API (たとえば モジュールグローバル API) を使うべきです。
|
各種マニュアル:
PHPマニュアル |
PEARマニュアル |
Smarty(英語)マニュアル |
PHP-GTKマニュアル |
「スレッドセーフなリソースマネージャ」をGoogle検索
|