我遇到了 php-fpm 的一个错误:区域设置随机改变。
以下是正确的区域设置:
Array
(
[decimal_point] => .
[thousands_sep] =>
[int_curr_symbol] =>
[currency_symbol] =>
[mon_decimal_point] =>
[mon_thousands_sep] =>
[positive_sign] =>
[negative_sign] =>
[int_frac_digits] => 127
[frac_digits] => 127
[p_cs_precedes] => 127
[p_sep_by_space] => 127
[n_cs_precedes] => 127
[n_sep_by_space] => 127
[p_sign_posn] => 127
[n_sign_posn] => 127
[grouping] => Array
(
)
[mon_grouping] => Array
(
)
)
更改后的设置如下:
Array
(
[decimal_point] => ,
[thousands_sep] =>
[int_curr_symbol] => EUR
[currency_symbol] => €
[mon_decimal_point] => ,
[mon_thousands_sep] =>
[positive_sign] =>
[negative_sign] => -
[int_frac_digits] => 2
[frac_digits] => 2
[p_cs_precedes] => 0
[p_sep_by_space] => 1
[n_cs_precedes] => 0
[n_sep_by_space] => 1
[p_sign_posn] => 1
[n_sign_posn] => 1
[grouping] => Array
(
[0] => 3
)
[mon_grouping] => Array
(
[0] => 3
)
)
该问题随机发生。
删除 php-fpm 并使用 FastCGI 后,问题不再出现。如何使用 php-fpm 使其正常工作?问题发生在共享主机上(我们是提供主机的公司),我们确实需要 php-fpm 才能使用池。
提前致谢!
编辑:今天我发现当我们使用按需进程管理器而不是静态进程管理器时会出现问题。
答案1
这一强烈警告PHP 文档解释该问题:
警告区域设置信息是按进程而不是按线程维护的。如果您在多线程服务器 API(如 Windows 上的 IIS、HHVM 或 Apache)上运行 PHP,您可能会在脚本运行时遇到区域设置突然更改的情况,尽管脚本本身从未调用过 setlocale()。发生这种情况的原因是其他脚本同时在同一进程的不同线程中运行,并使用 setlocale() 更改了进程范围的区域设置。
在 FastCGI 设置中您看不到这种情况,因为每次页面加载都会生成一个新进程。但在 php-fpm 中,进程池会无限期地维护。
为了解决这个问题,理想情况下每个客户都应该有自己的 php-fpm 池。然后客户将负责他们运行的任何应用程序,这些应用程序在启动时没有正确设置区域设置。