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

kos*_*tyl 2 php apache multithreading setlocale

我们 在PHP中有setlocale函数.此功能有警告消息

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

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

# ifdef PHP_WIN32
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
# endif
Run Code Online (Sandbox Code Playgroud)

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

mar*_*rio 6

你已经提供了答案:

每个进程维护语言环境信息,而不是每个线程.[...]

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

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

因此,如果您运行的是专门为此准备的系统,则无需关心.为了便于您的应用程序,您仍应牢记这一点.(尽管我认为Apache广泛使用的MPM并没有被广泛使用.)