openssl_random_pseudo_bytes () медленный (PHP)

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

В 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 это медленно. Простите об этом».

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

Открыть ошибку на rt.openssl.org
разработчики curl обсуждают альтернативные методы сбора энтропии на Win32
Архив групп Google в списке пользователей OpenSSL, в котором обсуждается медленность RAND_poll () в Win32
Еще одна дискуссия о медленности RAND_screen () в архиве OpenSSL для mail-archive.com

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

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

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

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

  1. Apache + PHP-CGI = требуется 600 мс
  2. Модуль Apache + PHP5 = мгновенно