4

PHPのロケールについて読んでいsetlocale()ますが、スレッドに問題があるようです。(私はスレッドにあまり精通していません-ドキュメントはそれがスレッドセーフではないと述べています)

プロジェクトに特定の数値形式を処理できるようにしたいのですが、Intl拡張機能は興味深いようです。

http://php.net/manual/en/book.intl.php

setlocale()Intl拡張機能を使用した場合と同じ問題が発生する可能性がありますか?

4

2 に答える 2

3

さて、私もこれに興味があったので、テストを考案しました。

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です。

于 2012-06-14T01:42:52.640 に答える
2

Intl拡張機能は、フレームワーク内で作業していない場合に安全で非常に便利です。

たとえば、Symfony2を使用している場合、FormsとValidatorsを使用するとプログラムがクラッシュする可能性があります。

于 2012-06-14T01:03:40.890 に答える