· 10 min read

PHP: ZTSとNTSの違いとは何ですか?

PHPは、Web開発に広く使用されているスクリプト言語であり、そのバージョンにはZTS(スレッドセーフ)とNTS(非スレッドセーフ)の2つの異なるビルドがあります。これらの用語は、PHPの内部でのスレッドの扱い方を示しています。この記事では、ZTSとNTSの違い、それぞれがどのような状況で使用されるべきか、そしてどのようにして自分が使用しているPHPがZTSビルドなのか、それともNTSビルドなのかを判断するかについて説明します。これらの理解は、PHPのパフォーマンスを最適化し、問題をデバッグする上で非常に重要です。それでは、詳しく見ていきましょう。

ZTSとは

ZTSは「Zend Thread Safety」の略で、PHPがスレッドセーフモードでコンパイルされたバージョンを指します。スレッドセーフとは、複数のスレッドが同時に実行される環境で、各スレッドが他のスレッドに影響を与えずに安全に実行できることを意味します。ZTSビルドは、マルチスレッドのWebサーバー(Apacheなど)でPHPを使用する場合に必要です。これは、各リクエストが独自のスレッドで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。ZTSビルドでは、PHPエンジンは各スレッドが安全に実行できるように、内部データ構造を保護します。しかし、この保護にはパフォーマンス上のコストがあります。そのため、ZTSビルドは一般的にNTSビルドよりもわずかに遅くなる傾向があります。ただし、マルチスレッド環境では、ZTSビルドの使用が必須です。

NTSとは

NTSは「Non-Thread Safe」の略で、PHPが非スレッドセーフモードでコンパイルされたバージョンを指します。非スレッドセーフとは、複数のスレッドが同時に実行される環境で、各スレッドが他のスレッドに影響を与える可能性があることを意味します。NTSビルドは、シングルスレッドのWebサーバー(Nginxなど)やCLI(Command Line Interface)でPHPを使用する場合に適しています。これは、各リクエストが独自のプロセスで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。NTSビルドでは、PHPエンジンは内部データ構造を保護する必要がないため、パフォーマンスが向上します。そのため、NTSビルドは一般的にZTSビルドよりも高速です。ただし、シングルスレッド環境でのみ、NTSビルドの使用が推奨されます。

ZTSとNTSの違い

ZTSとNTSの主な違いは、PHPがマルチスレッド環境で動作するか、シングルスレッド環境で動作するかにあります。ZTSビルドは、マルチスレッドのWebサーバーでPHPを使用する場合に適しています。これは、各リクエストが独自のスレッドで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。一方、NTSビルドは、シングルスレッドのWebサーバーまたはCLIでPHPを使用する場合に適しています。これは、各リクエストが独自のプロセスで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。

また、パフォーマンスの観点からも違いがあります。ZTSビルドでは、PHPエンジンは内部データ構造を保護するため、パフォーマンス上のコストが発生します。そのため、ZTSビルドは一般的にNTSビルドよりもわずかに遅くなる傾向があります。一方、NTSビルドでは、PHPエンジンは内部データ構造を保護する必要がないため、パフォーマンスが向上します。そのため、NTSビルドは一般的にZTSビルドよりも高速です。

しかし、これらの違いを理解することは、PHPのパフォーマンスを最適化し、問題をデバッグする上で非常に重要です。それぞれのビルドがどのような状況で最適であるかを理解することで、PHPのパフォーマンスを最大限に引き出すことができます。それでは、次のセクションでZTSとNTSの適用環境について詳しく見ていきましょう。

ZTSとNTSの適用環境

ZTSとNTSの適用環境は、主にWebサーバーの種類と使用状況によります。

ZTSビルドは、マルチスレッドのWebサーバー(Apacheなど)でPHPを使用する場合に適しています。これは、各リクエストが独自のスレッドで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。このような環境では、ZTSビルドが必要となります。

一方、NTSビルドは、シングルスレッドのWebサーバー(Nginxなど)やCLI(Command Line Interface)でPHPを使用する場合に適しています。これは、各リクエストが独自のプロセスで処理され、それぞれが独自のPHPインタープリターインスタンスを持つためです。このような環境では、NTSビルドが推奨されます。

しかし、これらの適用環境は一般的なケースであり、特定の状況や要件によっては異なる選択をすることもあります。例えば、特定のPHP拡張機能がZTSビルドでしか利用できない場合や、特定のパフォーマンス要件がある場合などです。そのため、自身の環境と要件に合わせて最適なビルドを選択することが重要です。それでは、次のセクションでZTSとNTSの判断方法について詳しく見ていきましょう。

ZTSとNTSの判断方法

PHPがZTSビルドであるかNTSビルドであるかを判断する方法はいくつかありますが、最も一般的な方法は、PHPのphpinfo()関数を使用することです。この関数は、PHPの設定情報を表示します。phpinfo()関数を実行した結果の中に、「Thread Safety」または「Zend Thread Safety」という項目があります。この項目の値が「enabled」であれば、PHPはZTSビルドであり、「disabled」であれば、PHPはNTSビルドです。

また、コマンドラインからもPHPのビルドタイプを確認することができます。コマンドラインでphp -iを実行し、出力結果を確認します。出力結果の中に「Thread Safety」または「Zend Thread Safety」という項目があり、その値が「enabled」であれば、PHPはZTSビルドであり、「disabled」であれば、PHPはNTSビルドです。

これらの方法を使用して、自身が使用しているPHPがZTSビルドなのか、それともNTSビルドなのかを判断することができます。それでは、最後のセクションでまとめていきましょう。

まとめ

この記事では、PHPのZTSビルドとNTSビルドの違い、それぞれがどのような状況で使用されるべきか、そしてどのようにして自分が使用しているPHPがZTSビルドなのか、それともNTSビルドなのかを判断するかについて説明しました。ZTSビルドはマルチスレッドのWebサーバーで、NTSビルドはシングルスレッドのWebサーバーまたはCLIで使用することが推奨されます。しかし、これらは一般的なケースであり、特定の状況や要件によっては異なる選択をすることもあります。そのため、自身の環境と要件に合わせて最適なビルドを選択することが重要です。また、phpinfo()関数やコマンドラインを使用して、自身が使用しているPHPがZTSビルドなのか、それともNTSビルドなのかを判断することができます。これらの理解は、PHPのパフォーマンスを最適化し、問題をデバッグする上で非常に重要です。それでは、最後に、PHPのビルドタイプを理解し、それを適切に選択・使用することで、PHPのパフォーマンスを最大限に引き出すことができることを覚えておいてください。それでは、Happy Coding!

    Share:
    Back to Blog