2009-12-21 1 views
9

Я использую opennssl_random_pseudo_bytes() в PHP и работает очень медленно. Мое приложение часто отключает тайм-аут (выдает эту ошибку ограничения времени выполнения). Есть ли какая-то особая причина случайности OpenSSL для этого медленного? Я использую Windows 7 x86 в настоящее время на моей машине разработчика.openssl_random_pseudo_bytes() is slow (PHP)

+1

Как вы используете его? –

+0

Просто позвонив по адресу openssl_random_pseudo_bytes (8); и он работает очень медленно. – Tower

+0

Вы пробовали его с более длинной строкой, например 'openssl_random_pseudo_bytes (512)'? –

ответ

5

Это было, по-видимому, ошибка в PHP < 5.3.4.

Исправлено возможное поведение блокировки в openssl_random_pseudo_bytes на Windows. (Pierre)

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

+0

Это вызывает проблему для моего сервера Windows 2008 при производстве, но у меня нет проблем на моем собственном компьютере под управлением Windows XP. Обе машины работают с PHP 5.3.1. – neobie

+0

@neobie: Поскольку указано, что существует «** возможное поведение блокировки», возможно, это возможно, что он просто не появился на XP, но попробовал ли вы его с версией > = 5.3.4? – Levit

+1

Это кажется неправильным. Читайте здесь: https://bugs.php.net/bug.php?id=51636 – mgutt

10

В Windows, openssl_random_pseudo_bytes() вызывает RAND_screen() OpenSSL для генерации энтропии. Это довольно медленно, и PHP вряд ли является первым unix-> портом Windows, который столкнулся с этим. Похоже, общий совет заключается в использовании RAND_seed().

Также интересно отметить, что в документации OpenSSL говорится:

Функция RAND_screen() доступна для удобства программистов Windows. Он добавляет текущее содержимое экрана в PRNG. Для приложений, которые могут захватывать события Windows, сеяние PRNG путем вызова RAND_event() является значительно лучшим источником случайности. ** Следует отметить, что оба метода не могут использоваться на серверах, работающих без взаимодействия с пользователем **.

Так что это может быть сертифицированная ошибка. Я уже поднял проблему с основными разработчиками. Пока не появится более эффективный метод генерации энтропии для OpenSSL на Win32, кажется, что короткий ответ: «Да, в Windows это медленно. Простите об этом».

Некоторые дополнительные ссылки, которые обсуждают проблему:

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

Это зависит от того, как вы запускаете PHP. На мой win7-64bit PHP5.3.27

  1. Apache + PHP-CGI = Требуется 600мс
  2. Apache + PHP5 Module = Это мгновенное
+0

«Это мгновенно» - как примерный пример моего модуля Win7-64bit PHP5.5 (i7 3.5GHz) Я могу назвать 'opennssl_random_pseudo_bytes (16) '1 миллион раз в 1,55 (+0,02) секунды. (Я немного нервничал, увидев несколько, хотя и более старых, сообщений о «медленной работе».) – MrWhite