validators used the módulo instalar instalado for extensions extension está enabled enable and php localization thread-safety locale php-extension

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 .