2012-06-14 4 views
4

PHP에서 로케일에 대해 읽었습니다. setlocale()에 스레드 문제가있는 것으로 보입니다. (I 스레드 너무 익숙하지 않은 해요 - 워드 프로세서는 스레드로부터 안전하지 않습니다 언급)PHP Intl 확장 스레드가 안전합니까?

내 프로젝트를 특정 번호 형식과 국제 확장이 재미있는 것 같다 처리 할 수있는 기능을 제공하고 싶습니다.

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

나는 setlocale() 그 같은 문제가 국제 확장을 사용하고있다 기대해야 하는가?

답변

3

좋아, 나 자신도이에 대한 호기심, 그래서 테스트를 고안했다.

는 우선이 두 파일 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()과 일치하는 것으로 보입니다. 에서와 같이 동일한 방식으로

<?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()); 

을 다음 두 개의 별도의 탭에서 다시 실행 : /편집

는 다음, 나는이 두 파일 IntlDateFormatter 테스트 첫 번째 파일 세트. 이 이 예상 한 결과를 제공합니다. locale1.php이 자고있는 동안 locale2.php은 미국 규칙에 따라 미국 영어로 날짜를 멋지게 인쇄합니다. 그 후 locale1.php은 네덜란드어 규칙에 따라 네덜란드어로 날짜를 멋지게 인쇄합니다.

그래서, 결론, Intlsetlocale 문제에서 안전 나타납니다.

물론 마음도 Hyunmin Kim's 대답. 나는 Intl을 사용하는 경험이 부족하기 때문에 이에 대해 언급 할 수 없었다. 나는 최근에만 Intl을 발견했습니다.

+0

재미있는 테스트 - 아직 로케일을 실험하지는 않았으므로 이것은 새로운 영역입니다. 'setlocale'과'Intl' 접근 방식의 차이점은 무엇입니까? – RS7

+0

글쎄요, 한 가지로,'Intl'은이 점에서 더 안전하고 신뢰할 수있는 것 같습니다. 당신이 언급 한'setlocale'의 스레드 문제는 정확히 내가 드러낸 바로이 문제입니다. 좋은 다른 지역화 된 날짜를 인쇄하려고 할 때 다른 스레드 (다른 PHP 스크립트를 의미)가 로케일을 변경하지 않는다는 것을 결코 확신 할 수 없습니다 (또는'setlocale'에 의존하는 다른 것). –

2

Intl 확장은 프레임 워크 안에서 작업하지 않는 경우 안전하고 매우 유용합니다. 예를 들어

, 프로그램은 양식 및 검사기를 가장 가능성이 충돌을 사용하는 때, 당신은 Symfony2를 사용하는 경우.

+0

내 프로젝트에서 현재 CodeIgniter 프레임 워크를 사용하고 있습니다. 문제가 있습니까? – RS7

관련 문제