У меня возникла ошибка с 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 для использования пулов.
Заранее спасибо!
EDIT: Сегодня я обнаружил, что проблема возникает, когда мы используем Ondemand Process Manager, а не Static Process Manager.
Это сильное предупреждение в Документация PHP объясняет проблему:
Предупреждение Информация о языковом стандарте сохраняется для каждого процесса, а не для потока. Если вы используете PHP на многопоточном серверном API, таком как IIS, HHVM или Apache в Windows, вы можете столкнуться с внезапными изменениями настроек локали во время работы сценария, хотя сам сценарий никогда не вызывал setlocale (). Это происходит из-за того, что другие скрипты выполняются в разных потоках одного и того же процесса одновременно, изменяя локаль всего процесса с помощью setlocale ().
Вы не видите этого в настройке FastCGI, потому что новый процесс создается при каждой загрузке страницы. Но в php-fpm пул процессов поддерживается бесконечно.
Для решения проблемы в идеале у каждого клиента должен быть собственный пул php-fpm. Затем заказчик несет ответственность за любые запускаемые им приложения, которые неправильно устанавливают языковой стандарт при запуске.