3

I've wrote this test script:

<?php
ini_set('error_reporting', E_ALL );
putenv('LC_ALL=ru_RU.UTF-8');
putenv('LANG=ru_RU');
putenv('LANGUAGE=ru_RU');
setlocale (LC_ALL, "ru_RU.UTF-8");
for($i=0; $i<7; $i++){
    echo setlocale(LC_ALL, 0) . "<br>\n";
    sleep(1);
}
?>

there is it output:

ru_RU.UTF-8
ru_RU.UTF-8
C
ru_RU.UTF-8
ru_RU.UTF-8
ru_RU.UTF-8
C

Why locale sometimes crashes? How to fix this?

4

1 に答える 1

0

http://php.net/manual/en/function.setlocale.phpから...

警告: ロケール情報は、スレッドごとではなく、プロセスごとに維持されます。Windows 上の IIS や Apache などのマルチスレッド サーバー API で PHP を実行している場合、スクリプト自体が setlocale() を呼び出すことはありませんが、スクリプトの実行中にロケール設定が突然変更されることがあります。これは、同じプロセスの異なるスレッドで同時に実行されている他のスクリプトが原因で発生し、setlocale() を使用してプロセス全体のロケールを変更します。

私は PHP の専門家ではありませんが、最初に適切なロケールで PHP を起動することで簡単に解決できると思います。これに gentoo のタグを付けました。Gentoo を使用していて Apache の mod_php を使用していない場合は、www-servers/spawn-fcgi から /etc/init.d/spawn-fcgi (私が書いたもの) を使用して LC_ALL を設定できるはずです。詳細については、/etc/conf.d/spawn-fcgi を参照してください。

于 2012-11-20T13:54:47.173 に答える