PHP Intl扩展线程安全吗?
我一直在阅读
PHP中的语言环境,似乎setlocale()在线程方面存在问题. (我对线程不太熟悉 – 文档提到它不是线程安全的)
我想让我的项目能够处理某些数字格式,Intl扩展看起来很有趣. http://php.net/manual/en/book.intl.php 我是否应该期待setlocale()使用Intl扩展的相同问题? 解决方法
好吧,我自己也很好奇,所以我设计了一个测试.
首先,我用这两个文件测试了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,time() ); 然后我在两个单独的标签中执行它们.第一个locale1.php,在设置语言环境后休眠10秒,让我们有时间同时执行locale2.php. 令我惊讶的是,locale2.php甚至不允许正确更改语言环境.在locale1.php中出现sleep(10),以这样的方式劫持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,'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','America/Los_Angeles' ); echo $dateFormatter->format( time() ); 然后在两个单独的选项卡中再次执行它们,方式与第一组文件相同.这确实给出了预期的结果:当locale1.php正在睡觉时locale2.php根据美国规则很好地用美式英语打印日期,之后locale1.php根据荷兰规则很好地用荷兰语打印日期. 因此,最后,看来Intl对于setlocale问题是安全的. 但当然还要介意Hyunmin Kim’s的答案.由于缺乏使用Intl的经验,我无法对此发表评论.我最近才发现Intl. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |