【问题标题】:openssl_random_pseudo_bytes() is slow (PHP)openssl_random_pseudo_bytes() 很慢 (PHP)
【发布时间】:2009-12-21 13:44:12
【问题描述】:

我在 PHP 中使用 opennssl_random_pseudo_bytes(),它的执行速度非常慢。我的应用程序经常超时(抛出执行时间限制错误)。 OpenSSL random 这么慢有什么特别的原因吗?我目前在我的开发人员机器上使用的是 Windows 7 x86。

【问题讨论】:

  • 只需调用它 openssl_random_pseudo_bytes(8);而且它运行得很慢。
  • 你试过用更长的字符串,比如openssl_random_pseudo_bytes(512)吗?
  • 无论是 1、512 还是 1024,我都看不到给定值之间的任何差异。该函数总是运行得很慢。
  • 我也遇到过,不知道为什么这么慢...
  • 我知道其他人也遇到过这种情况,因为我已经在四台不同的 Windows 机器上尝试过这个函数,结果一直都是一样的——函数调用非常慢。我认为这与 Windows 及其在池中生成熵的方式有关。出于某种原因,OpenSSL 获取熵的速度非常缓慢。

标签: php openssl


【解决方案1】:

在 Windows 上,openssl_random_pseudo_bytes() 调用 OpenSSL 的 RAND_screen() 来生成熵。它很慢,而且 PHP 几乎不是第一个遇到此问题的 unix->windows 端口。看起来常见的建议是改用 RAND_seed()。

有趣的是,OpenSSL 文档指出:

RAND_screen() 函数可用于方便 Windows 程序员。它将屏幕的当前内容添加到 PRNG。对于可以捕获 Windows 事件的应用程序,通过调用 RAND_event() 播种 PRNG 是一个明显更好的随机源。 **应当指出的是 这两种方法都不能在没有用户交互的情况下运行的服务器上使用**。

所以这实际上可能是一个经过认证的错误 - 我已经向核心开发人员提出了这个问题。在 Win32 上为 OpenSSL 生成熵的更好方法可用之前,简短的回答似乎是“是的,它在 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

    修复了可能的阻塞行为 openssl_random_pseudo_bytes on 视窗。 (皮埃尔)

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

    【讨论】:

    • 这会导致我的 Windows 2008 服务器在生产中出现问题,但在我自己的运行 Windows XP 的计算机上没有问题。两台机器都运行 PHP 5.3.1
    • @neobie:由于它被声明为“可能阻塞行为”,它可能只是没有出现在 XP 上,但你试过了吗版本 >= 5.3.4 了吗?
    【解决方案3】:

    这取决于您如何运行 PHP。在我的win7-64bit PHP5.3.27上

    1. Apache + PHP-CGI = 需要 600 毫秒
    2. Apache + PHP5 模块 = 即时

    【讨论】:

    • “即时” - 作为我的 Win7-64 位 PHP5.5 模块 (i7 3.5GHz) 的粗略基准,我可以在 1.55(+0.02) 秒内调用 opennssl_random_pseudo_bytes(16) 100 万次。 (看到几篇关于“性能缓慢”的帖子,尽管是较旧的帖子,我有点紧张。)
    猜你喜欢
    • 2010-11-22
    • 2016-01-01
    • 2012-08-27
    • 2015-04-07
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多