为什么PHP开发人员不能按照线程范围提供setlocale函数

时间:2011-04-15 09:00:46

标签: php multithreading apache setlocale

我们setlocale PHP中的函数。此功能有警告信息

  

每个进程维护区域设置信息,而不是每个线程。如果您在Windows上运行多线程服务器API(如IIS或Apache)上的PHP,则在脚本运行时可能会遇到区域设置的突然更改,尽管脚本本身从未调用过setlocale()。这是因为其他脚本同时在同一进程的不同线程中运行,使用setlocale()更改了进程范围的语言环境。

例如,带有miltithread设置的windows的apache。我在PHP项目中找到了这些代码行:

# ifdef PHP_WIN32
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
# endif

如果此代码有效,为什么我们必须关注setlocale函数的警告?

1 个答案:

答案 0 :(得分:6)

你已经提供了答案:

  

每个进程维护区域设置信息,而不是每个线程。 [...]

这不是PHP问题,而是区域设置的工作方式。更改它适用于整个运行过程。这是一个不了解应用程序内部线程的系统设置。

现在看来,由于Windows通过系统调用处理语言环境和线程,它可以完成不可思议的任务:应用每个线程的语言环境设置。
这是一个参考: http://msdn.microsoft.com/en-us/library/ms235302(v=vs.80).aspx

因此,如果您运行的是专门为此准备的系统,则无需关心。为了您的应用程序的可移植性,您仍然应该记住它。 (尽管我认为Apache广泛使用的MPM并没有被广泛使用。)