2

PHPにはsetlocale関数があります。この関数には警告メッセージがあります

ロケール情報は、スレッドごとではなく、プロセスごとに保持されます。Windows 上の IIS や Apache などのマルチスレッド サーバー API で PHP を実行している場合、スクリプト自体が setlocale() を呼び出すことはありませんが、スクリプトの実行中にロケール設定が突然変更されることがあります。これは、同じプロセスの異なるスレッドで同時に実行されている他のスクリプトが原因で発生し、setlocale() を使用してプロセス全体のロケールを変更します。

たとえば、miltithread 設定の Windows 用の apache です。PHP プロジェクトで次のコード行を見つけました。

# ifdef PHP_WIN32
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
# endif

このコードが機能する場合、setlocale 関数の警告に注意する必要があるのはなぜですか?

4

1 に答える 1

6

あなたはすでに答えを提供しています:

ロケール情報は、スレッドごとではなく、プロセスごとに維持されます。[...]

これは PHP の問題ではなく、ロケール設定がどのように機能するかだけです。それを変更すると、実行中のプロセス全体に適用されます。これは、アプリケーションの内部スレッドを認識しないシステム設定です。

Windows はシステム コールを介してロケールとスレッド化の両方を処理するため、スレッドごとにロケール設定を適用するという、考えられないタスクを実行できるようになりました。
ここに参照があります: http://msdn.microsoft.com/en-us/library/ms235302(v=vs.80).aspx

したがって、そのために特別に準備されたシステムで実行する場合は、気にする必要はありません。アプリケーションの移植性については、それでも心に留めておく必要があります。(ただし、Apache スレッド MPM はそれほど広く使用されていないと思います。)

于 2011-04-15T09:19:12.557 に答える