问题描述
我注意到 PHP 的 str_word_count
在命令行和网络上的行为不同。这种行为似乎是由于每个环境中的默认语言环境值造成的。如果我使用 setlocale 查看当前语言环境 (echo setlocale(LC_ALL,0);
),在命令行上我得到
C/en_US.UTF-8/C/C/C/C
在网络上我得到
C
那么各种 PHP SAPI(cli、fpm、mod_PHP 等)从哪里获得这个默认值?
我的假设是奇怪的 C/en_US.UTF-8/C/C/C/C
语言环境所有六个语言环境类别都挤在一起,这告诉我 LC_CTYPE=en_US.UTF-8
和其他类别都设置了 C
语言环境 - - 所以换一种方式提出我的问题:为什么我的 PHP-fpm 服务器的所有语言环境类别默认设置为 C
,而我的命令行 PHP 有一个语言环境设置为 en_US.UTF-8
解决方法
您可以在 php.ini 中设置 intl.default_locale
,看起来 PHP 正在直接从 shell 环境中获取这些值,并且 LC_CTYPE
的值还将检查 LANG
的值
% cat test.php
<?php
echo setlocale(LC_ALL,0),"\n";
% echo $LANG
en_US.UTF-8
% echo $LC_CTYPE
% php test.php
C/en_US.UTF-8/C/C/C/C
% LC_CTYPE=C php test.php
C
% LANG=C php test.php
C
% LANG=C LC_CTYPE=en_US.UTF-8 php test.php
C/en_US.UTF-8/C/C/C/C
因此,对于用户的个人 shell,MacOS 似乎将 LANG 设置为 en_US.UTF-8
。我的假设是当我通过
brew services start php
那个——LaunchAgent? -- 正在使用 LANG
或 LC_CTYPE
设置为 C
的 shell -- 大概是因为只有人类才对查看 UTF-8 格式的内容感兴趣。