2009-12-21 15 views
9

Estoy usando opennssl_random_pseudo_bytes() en PHP y está funcionando muy lentamente. Mi aplicación a menudo expira (arroja ese error de límite de tiempo de ejecución). ¿Hay alguna razón particular para que OpenSSL al azar sea tan lento? Estoy usando Windows 7 x86 actualmente en mi máquina de desarrollador.openssl_random_pseudo_bytes() es lento (PHP)

+1

¿Cómo lo estás usando? –

+0

Con solo llamarlo openssl_random_pseudo_bytes (8); y funciona muy lentamente. – Tower

+0

¿Lo has probado con una cadena más larga, digamos 'openssl_random_pseudo_bytes (512)'? –

Respuesta

5

Esto era al parecer un fallo en PHP 5.3.4 <.

Corregido el comportamiento de bloqueo posible en openssl_random_pseudo_bytes en de Windows. (Pierre)

http://php.net/ChangeLog-5.php#5.3.4

+0

Causa problemas en la producción de mi servidor de Windows 2008, pero no tengo ningún problema en mi propia computadora con Windows XP. Ambas máquinas ejecutan PHP 5.3.1 – neobie

+0

@neobie: como se dice que tiene un "comportamiento de bloqueo ** ** posible", es posible que simplemente no aparezca en XP, pero ¿lo has probado con una versión? > = 5.3.4 todavía? – Levit

+1

Esto parece estar mal. Lea aquí: https://bugs.php.net/bug.php?id=51636 – mgutt

10

En Windows, openssl_random_pseudo_bytes() llama a RAND_screen() de OpenSSL para generar entropía. Es bastante lento, y PHP no es el primer puerto de Windows que se ha topado con esto. Parece que el consejo más común es usar RAND_seed() en su lugar.

También es interesante notar que la documentación de OpenSSL afirma:

La función RAND_screen() está disponible para la comodidad de los programadores de Windows. Agrega el contenido actual de la pantalla al PRNG. Para aplicaciones que pueden atrapar eventos de Windows, sembrar el PRNG llamando a RAND_event() es una fuente significativamente mejor de aleatoriedad. ** Debe tenerse en cuenta que ambos métodos no se pueden usar en servidores que se ejecutan sin la interacción del usuario **.

Esto puede ser un error certificado. Ya he planteado el problema con los desarrolladores de núcleo. Hasta que esté disponible un mejor método para generar entropía para OpenSSL en Win32, parece que la respuesta breve es "Sí, es lenta en Windows. Lo siento".

Algunos enlaces adicionales que tratan sobre el problema:

Open Bug at rt.openssl.org
curl developers discuss alternative methods of collecting entropy on Win32
Google Groups archive of OpenSSL Users List discussing the slowness of RAND_poll() on Win32
Another discussion on the slowness of RAND_screen() on mail-archive.com's archive of OpenSSL Users

2

Depende de cómo ejecutar PHP. En mi PHP5.3.27 win7-64bit

  1. Apache + PHP-CGI = Toma 600ms
  2. módulo de Apache + PHP5 = Es instantánea
+0

"Es instantáneo": como punto de referencia aproximado en mi módulo Win7-64bit PHP5.5 (i7 3.5GHz) puedo llamar 'opennssl_random_pseudo_bytes (16) '1 millón de veces en 1.55 (+0.02) segundos. (Me puse un poco nervioso después de ver varias publicaciones, aunque más antiguas, sobre "rendimiento lento"). – MrWhite