2

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

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

例如,具有多线程设置的 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 回答