Назад | Перейти на главную страницу

php-fpm: настройки локали меняются сами

У меня возникла ошибка с 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. Затем заказчик несет ответственность за любые запускаемые им приложения, которые неправильно устанавливают языковой стандарт при запуске.