Windows版PHPのTS・NTSはどちらを選ぶ? Apacheの接続方式と確認方法
作成日:2026.10.30
Windows版PHPのThread Safe(TS)とNon Thread Safe(NTS)の違いと選び方を解説します。Apacheモジュール方式とFastCGI方式の違い、XAMPPの設定の読み方、CLIとWeb側で使われるPHP・php.iniの確認方法、DLLを選ぶ際の注意点を紹介します。
目次
Windows版PHPをダウンロードすると、Thread Safe(TS)とNon Thread Safe(NTS)の2種類があります。XAMPPでPHPを更新するときも、どちらを選べばよいのか迷うところです。
先に結論を書くと、ApacheがPHPをモジュールとして読み込む方式ではTS版が必要です。ApacheからFastCGIでPHPを呼び出す構成ならNTS版を選びます。
今回は、WindowsのApache 2.4・PHP 8系を対象に、選択の考え方と既存設定の読み方を整理します。
TS・NTSは、PHPの呼び出し方に合わせて選ぶ
TSはThread Safe、NTSはNon Thread Safeの略で、PHPのビルドの種類です。TS版は、複数のスレッドからPHPを実行する環境に対応するための仕組みを備えています。アプリケーションのDB更新やファイル操作まで、自動的に競合しなくなるという意味ではありませんので注意。
PHP公式のWindows向けビルドの説明では、Apacheのmod_php向けにTS、FastCGI向けにNTSが案内されています。選び方をまとめると、次のようになります。
| 実行方法 | PHPの呼び出し方 | 選択の目安 |
|---|---|---|
| Apacheモジュール方式 | Apacheのプロセス内でPHPを実行する | TSが必要 |
| FastCGI方式 | ApacheなどのWebサーバーから、別プロセスのPHPへ処理を渡す | NTSを選ぶ |
| CLI専用 | コマンドラインでphp.exeを実行する | 公式はNTSを推奨。TSでもCLIを実行できる |
WindowsのApacheは、リクエストをスレッドで処理します。そのプロセス内へPHPを読み込む場合にTSが必要になる、という関係です。詳細はApache公式のWindows版の説明と、PHP公式のApacheとの接続手順を参照してください。
なお、以前のXAMPPのPHP更新記事ではNTS版を選ぶ説明をしていますが、Apacheモジュール方式ではTS版が必要です。XAMPPというプロダクト名だけでNTSと判断せず、以下の設定を確認してください。
Apacheの設定から、PHPを呼び出す方式を調べる
XAMPPのApacheがC:\xampp\apacheにある例で確認してみます。インストール先が違う場合は読み替えてください。
まず、httpd.confのIncludeを確認します。PHPの設定が別ファイルへ分かれている場合、そのファイルまで読む必要があります。
Select-String -LiteralPath 'C:\xampp\apache\conf\httpd.conf' -Pattern '^\s*Include(?:Optional)?\s+'
今回参照した設定には、次の行がありました。
Include "conf/extra/httpd-xampp.conf"
続いて、そのファイルのPHP関連設定を調べます。
Select-String -LiteralPath 'C:\xampp\apache\conf\extra\httpd-xampp.conf' -Pattern 'LoadFile|LoadModule|SetHandler|PHPINIDir|FcgidWrapper|Action'
手元の設定から、モジュール方式の判断に関係する部分を抜粋すると次のとおりです。設定を追加するための一式ではなく、既存の設定を読むための例です。
LoadFile "C:/xampp/php/php8ts.dll"
LoadModule php_module "C:/xampp/php/php8apache2_4.dll"
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<IfModule php_module>
PHPINIDir "C:/xampp/php"
</IfModule>
LoadModule php_moduleでPHPのApache用DLLを読み込み、SetHandler application/x-httpd-phpでPHPファイルを処理しています。この構成はApacheモジュール方式なので、TS版を使います。PHPINIDirは、Apache側で利用するphp.iniの場所を指定しています。
一方、FastCGIの設定では、例えばFcgidWrapperからphp-cgi.exeを指定する記述などが手掛かりになります。使うApacheモジュールによって設定は異なるので、php-cgi.exeという文字が見つかっただけで決めず、どのハンドラーが対象のPHPファイルに適用されるかを確認します。
検索結果にはコメントも含まれます。今回のファイルにも、先頭が#のCGI設定が残っていました。コメント、<IfModule>の条件、VirtualHostやディレクトリごとの設定を含め、周囲の記述も読んで判断してください。また、別の設定ファイルで起動するApacheや複数のインストールがある場合は、実際に使っている設定を調べる必要があります。
CLIで動いたPHPと、ApacheのPHPは別々に確認する
コマンドラインでphp -vが成功しても、Apacheが同じPHPを読み込むとは限りません。まず、PowerShellから見えるPHPの場所と設定を確認します。
Get-Command php -CommandType Application | Select-Object -ExpandProperty Source
php -v
php --ini
PHP自身からも、バージョン・実行方式・TS/NTS・設定ファイルを確認できます。次をruntime-check.phpとして保存します。
<?php
if (PHP_SAPI !== 'cli') {
header('Content-Type: text/plain; charset=UTF-8');
}
printf("PHP: %s\n", PHP_VERSION);
printf("SAPI: %s\n", PHP_SAPI);
printf("Build: %s\n", PHP_ZTS ? 'TS' : 'NTS');
printf("Bits: %d\n", PHP_INT_SIZE * 8);
printf("INI: %s\n", php_ini_loaded_file() ?: '(none)');
CLIでは、保存したディレクトリで実行します。
php .\runtime-check.php
今回のCLI環境では、次の結果になりました。
PHP: 8.3.15
SAPI: cli
Build: TS
Bits: 64
INI: C:\xampp\php\php.ini
PHP_ZTSはPHP自身のスレッドセーフビルドかどうかを示します。BitsはPHPの整数サイズから求めた値で、このWindows版PHPでは64ビットでした。OSが64ビットでも、利用するPHPやDLLが同じアーキテクチャとは限らないので、配布物の表記とも照合します。
Web側は、Apacheを通したリクエストで確認する
Web側を調べる場合は、同じファイルを、外部からアクセスできないローカルの検証用サイトに置いてApache経由で開きます。ブラウザーでPHPのソースがそのまま表示される場合は実行できていません。設定を確認し、診断用ファイルは確認後に削除してください。パスなどの情報が出るので、公開サイトへそのまま置かないようにします。
Apacheモジュール方式なら、期待する結果はSAPI: apache2handler、Build: TSです。INIも合わせて確認します。
FastCGI構成で使うcgi-fcgiというSAPI名は、CGIでも使われます。SAPIの文字列だけで両者を区別せず、Apache設定と組み合わせて判断します。SAPIの種類はPHP公式のphp_sapi_name()、ビルドの判定はPHPの定義済み定数を参照してください。
TS・NTS以外に、DLLの組み合わせも確認する
TS版を選べば、どのDLLでも読み込めるわけではありません。Apacheモジュール方式では、ApacheとPHPのアーキテクチャをそろえ、対象PHPに付属するApache用DLLを使います。php8apache2_4.dllという同じ名前でも、別のPHP配布物から持ってきて混ぜないようにします。
PHP拡張のDLLも、PHPのバージョン、TS/NTS、x86/x64などの条件を合わせる必要があります。必要なVisual C++ランタイムは、使用する配布物の案内とPHP公式の導入条件で確認してください。拡張の組み合わせとDLLの依存関係は、Windows版PHP拡張の公式説明が参考になります。
起動しない場合は、次の順で調べると原因を追いやすくなります。
- 実際に使っているApacheの設定と、PHPの参照先を確認する。
- 接続方式に合うTS/NTSと、x86/x64を選んでいるか確認する。
- Apacheの
ErrorLogで指定されたログを読み、読み込めなかったDLLやエラー内容を確認する。 - 対象DLLだけでなく、その依存DLL・ランタイムと、読み込む
php.iniや拡張設定を確認する。
「DLLが見つからない」というエラーでも、指定したDLL本体ではなく、依存先が不足している場合があります。別の環境のDLLを順にコピーして試す前に、配布物と依存関係をそろえたいところです。
Windows版PHPを選ぶときは、まず「Apacheの中で動かすのか、FastCGIで別プロセスへ渡すのか」を確認します。モジュール方式ならTS、FastCGIならNTSを基本に、CLIとWeb側で実際に使われるPHPを別々に確かめれば、選択の理由が分かりやすくなるかと思います。
奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
Laravel 13をApache・XAMPPで動かす:VirtualHost・.htaccess・public_htmlの配置方法
2026.08.27
Laravel 13のプロジェクトをWindowsのXAMPP Apacheで動かすために、VirtualHostでpublicをDocumentRootに指定する方法、.htaccessでpublicへ振り分ける方法、public_htmlへpublicの中身を配置してindex.phpの参照先を変更する方法を解説します。.envやstorageなどを公開しないための注意点、Viteのビルド成果物、ApacheとLaravelのログを使ったトラブルシューティングも整理します。
XAMPP環境でPHPを8.1から8.3にバージョンアップする手順と注意点
2025.01.22
XAMPP環境のPHPを8.3にアップデートする際の具体的な手順を解説します。また、curl関連のエラーとその解消方法についても触れています。
XAMPP環境にComposerをインストールする方法
2023.04.26
XAMPP環境にComposerを簡単にインストールする手順を紹介します。Windows向けインストーラーを使ったシンプルなインストール方法を解説します。
CodeIgniter 3のPHP更新に備える:8.1・8.3で主要機能の回帰テストを作る
2026.10.29
CodeIgniter 3のシステムをPHP 8.1から8.3へ更新する際の確認方法を解説します。ログイン・セッション・DB更新を7ケースの回帰テストで比較し、HTTP応答・保存結果・警告ログから不具合を切り分ける手順を紹介します。