PHP:setlocale 的值从何而来?

问题描述

我注意到 PHPstr_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。我的假设是当我通过

启动我的 php-fpm 实例时
brew services start php

那个——LaunchAgent? -- 正在使用 LANGLC_CTYPE 设置为 C 的 shell -- 大概是因为只有人类才对查看 UTF-8 格式的内容感兴趣。