PHPのロケールについて読んでいsetlocale()
ますが、スレッドに問題があるようです。(私はスレッドにあまり精通していません-ドキュメントはそれがスレッドセーフではないと述べています)
プロジェクトに特定の数値形式を処理できるようにしたいのですが、Intl拡張機能は興味深いようです。
http://php.net/manual/en/book.intl.php
setlocale()
Intl拡張機能を使用した場合と同じ問題が発生する可能性がありますか?
PHPのロケールについて読んでいsetlocale()
ますが、スレッドに問題があるようです。(私はスレッドにあまり精通していません-ドキュメントはそれがスレッドセーフではないと述べています)
プロジェクトに特定の数値形式を処理できるようにしたいのですが、Intl拡張機能は興味深いようです。
http://php.net/manual/en/book.intl.php
setlocale()
Intl拡張機能を使用した場合と同じ問題が発生する可能性がありますか?
さて、私もこれに興味があったので、テストを考案しました。
setlocale()
まず、次の2つのファイルでテストしました。
<?php
# locale1.php
error_reporting( E_ALL | E_STRICT );
date_default_timezone_set( 'Europe/Amsterdam' );
setlocale( LC_ALL, 'dutch_nld' ); // awkward Windows locale string
sleep( 10 ); // let's sleep for a bit here
echo strftime( '%A, %B %d, %Y %X %Z', time() );
と
<?php
# locale2.php
error_reporting( E_ALL | E_STRICT );
date_default_timezone_set( 'America/Los_Angeles' );
setlocale( LC_ALL, 'english_usa' ); // awkward Windows locale string
echo strftime( '%A, %B %d, %Y %X %Z', time() );
次に、2つの別々のタブでそれらを実行しました。まずlocale1.php
、ロケールを設定してから10秒間スリープlocale2.php
し、その間に実行する時間を与えます。
驚いたことにlocale2.php
、ロケールを正しく変更することさえ許可されていません。それは、Apache / PHPプロセスsleep( 10 )
をハイジャックして、その間にロケールを変更locale1.php
できないようにします。ただしlocale2.php
、その間はもちろん日付をエコーしますが、期待どおりにローカライズされていません。
編集:申し訳ありませんが、それをスクラップします。ロケールを変更し、locale2.php
睡眠locale1.php
後にオランダ語の代わりに英語の日付を出力するようです。したがって、これはから予想される動作と一致しているように見えますsetlocale()
。
/編集
IntlDateFormatter
次に、次の2つのファイルでテストしました。
<?php
# locale1.php
error_reporting( E_ALL | E_STRICT );
$dateFormatter = new IntlDateFormatter(
'nl_NL',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Amsterdam'
);
sleep( 10 ); // let's sleep for a bit here
echo $dateFormatter->format( time() );
と
<?php
# locale2.php
error_reporting( E_ALL | E_STRICT );
$dateFormatter = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles'
);
echo $dateFormatter->format( time() );
次に、最初のファイルセットの場合と同じように、2つの別々のタブでそれらを再度実行しました。これにより、期待どおりの結果がlocale1.php
得られます。睡眠中はlocale2.php
、アメリカの規則に従ってアメリカ英語で日付が適切に印刷され、その後、locale1.php
オランダの規則に従ってオランダ語で日付が適切に印刷されます。
したがって、結論として、その問題Intl
から安全であるように見えます。setlocale
もちろん、キム・ヒョンミンの答えも気に留めてください。の使用経験が不足しているため、コメントできませんでしたIntl
。私は最近発見したばかりIntl
です。
Intl拡張機能は、フレームワーク内で作業していない場合に安全で非常に便利です。
たとえば、Symfony2を使用している場合、FormsとValidatorsを使用するとプログラムがクラッシュする可能性があります。