我一直在阅读有关的PHP语言环境中,它似乎setlocale()
有螺纹的问题。 (我不是太熟悉线程 - 该文档提到它不是线程安全的)
我想给我的项目来处理某些数字格式和国际扩展似乎有趣的能力。
http://php.net/manual/en/book.intl.php
我应该想到的是,同样的问题setlocale()
已使用国际扩展?
我一直在阅读有关的PHP语言环境中,它似乎setlocale()
有螺纹的问题。 (我不是太熟悉线程 - 该文档提到它不是线程安全的)
我想给我的项目来处理某些数字格式和国际扩展似乎有趣的能力。
http://php.net/manual/en/book.intl.php
我应该想到的是,同样的问题setlocale()
已使用国际扩展?
好吧,我很好奇这个自己一样,所以我设计了一个试验。
首先,我测试setlocale()
这两个文件:
<?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() );
然后,我执行他们在两个不同的标签。 首先locale1.php
,在设定区域,给我们时间来执行之后进入睡眠状态10秒locale2.php
的同时。
令我惊讶的 locale2.php
根本不准正确更改语言环境。这似乎 sleep( 10 )
在locale1.php
劫持的Apache / PHP程序以这样一种方式,它不允许locale2.php
改变在此期间的语言环境。但它确实回响在课程的同时,日期,只是没有本地化为你所期望的。
编辑:对不起,该报废。 看来locale2.php
不会更改语言环境和locale1.php
然后睡觉后打印英语日期荷兰代替。 所以这确实出现了按照从与预期行为setlocale()
/编辑
然后,我测试IntlDateFormatter
这两个文件:
<?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() );
然后在两个单独的选项卡再次执行他们的方式与第一组文件相同。 这确实给了预期的结果:当locale1.php
正在睡觉locale2.php
很好的打印按照美国的规则,之后,美国英语的日期locale1.php
很好的打印根据荷兰规则荷兰的日期。
因此,得出的结论,看来Intl
是从安全setlocale
问题。
但也介意Hyunmin金的回答当然。 我不能对此发表意见,由于缺乏使用经验的Intl
。 我最近才发现Intl
。
如果你的工作不是一个框架内工作的国际扩展是安全的和非常有用。
例如,如果你使用的Symfony2,你的程序将使用表单和验证时,最有可能崩溃。