php - used - intl extension ubuntu
¿Es seguro el subproceso de la extensión PHP Intl? (2)
He estado leyendo sobre configuraciones regionales en PHP y parece que setlocale()
tiene problemas con los hilos. (No estoy muy familiarizado con los hilos: los documentos mencionan que no es seguro para subprocesos)
Me gustaría dar a mi proyecto la capacidad de tratar con ciertos formatos numéricos y la extensión Intl parece interesante.
http://php.net/manual/en/book.intl.php
¿Debo esperar los mismos problemas que setlocale()
tiene con la extensión Intl?
La extensión Intl es segura y muy útil si no está trabajando dentro de un marco.
Por ejemplo, si usa Symfony2, es muy probable que sus programas se bloqueen al usar Formularios y Validadores.
Ok, yo también tenía curiosidad sobre esto, así que ideé una prueba.
Primero probé setlocale()
con estos dos archivos:
<?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() );
y
<?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() );
Luego los ejecuté en dos pestañas separadas. Primero locale1.php
, que duerme durante 10 segundos después de establecer la configuración regional, dándonos tiempo para ejecutar locale2.php
mientras tanto.
Para mi sorpresa, locale2.php
ni siquiera tiene permitido cambiar la configuración regional correctamente.Parece que sleep( 10 )
en locale1.php
secuestra el proceso de Apache / PHP de tal manera que no permite a locale2.php
alterar la configuración regional mientras tanto.Sin embargo, se hace eco de la fecha mientras tanto, por supuesto, no está localizado como es de esperar.
Editar: lo siento, descarta eso. Parece que locale2.php
cambia la locale y locale1.php
y luego imprime la fecha en inglés en lugar de Dutch después de dormir. Entonces eso parece estar de acuerdo con el comportamiento esperado de setlocale()
. /Editar
Luego, probé IntlDateFormatter
con estos dos archivos:
<?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() );
y
<?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() );
y luego los ejecutó nuevamente en dos pestañas separadas, de la misma manera que con el primer conjunto de archivos. Esto da los resultados esperados: mientras que locale1.php
está durmiendo, locale2.php
imprime muy bien una fecha en inglés americano de acuerdo con las reglas estadounidenses, después de lo cual locale1.php
imprime muy bien una fecha en holandés según las reglas holandesas.
Entonces, concluyendo, parece que Intl
está a salvo de ese problema de setlocale
.
Pero también importa la respuesta de Hyunmin Kim, por supuesto. No pude comentar sobre eso, debido a la falta de experiencia con el uso de Intl
. Recientemente descubrí Intl
.