技術資料

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拡張の公式説明が参考になります。

起動しない場合は、次の順で調べると原因を追いやすくなります。

  1. 実際に使っているApacheの設定と、PHPの参照先を確認する。
  2. 接続方式に合うTS/NTSと、x86/x64を選んでいるか確認する。
  3. ApacheのErrorLogで指定されたログを読み、読み込めなかったDLLやエラー内容を確認する。
  4. 対象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のログを使ったトラブルシューティングも整理します。

.htaccess Apache Laravel PHP XAMPP

XAMPP環境でPHPを8.1から8.3にバージョンアップする手順と注意点

2025.01.22

XAMPP環境のPHPを8.3にアップデートする際の具体的な手順を解説します。また、curl関連のエラーとその解消方法についても触れています。

PHP XAMPP

XAMPP環境にComposerをインストールする方法

2023.04.26

XAMPP環境にComposerを簡単にインストールする手順を紹介します。Windows向けインストーラーを使ったシンプルなインストール方法を解説します。

Composer PHP XAMPP

CodeIgniter 3のPHP更新に備える:8.1・8.3で主要機能の回帰テストを作る

2026.10.29

CodeIgniter 3のシステムをPHP 8.1から8.3へ更新する際の確認方法を解説します。ログイン・セッション・DB更新を7ケースの回帰テストで比較し、HTTP応答・保存結果・警告ログから不具合を切り分ける手順を紹介します。

CodeIgniter PHP

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP