是PHP国际延伸线安全吗?(Is the PHP Intl extension thread saf

2019-09-18 02:45发布

我一直在阅读有关的PHP语言环境中,它似乎setlocale()有螺纹的问题。 (我不是太熟悉线程 - 该文档提到它不是线程安全的)

我想给我的项目来处理某些数字格式和国际扩展似乎有趣的能力。

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

我应该想到的是,同样的问题setlocale()已使用国际扩展?

Answer 1:

好吧,我很好奇这个自己一样,所以我设计了一个试验。

首先,我测试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



Answer 2:

如果你的工作不是一个框架内工作的国际扩展是安全的和非常有用。

例如,如果你使用的Symfony2,你的程序将使用表单和验证时,最有可能崩溃。



文章来源: Is the PHP Intl extension thread safe?