<?php$dmcryptText = \"大众dummy\"大众;$key = \"大众foobar\公众;$size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);$iv = mcrypt_create_iv($size); //把稳这里$m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv);var_dump($m);
当20个并发要求这个脚本的时候, 我们会创造Apache的相应韶光急剧上升…
考虑到这个问题可能具有一定的普遍性, 于是我想我还是写一篇文章来先容下这个坑, 防止后来人再次踩到.
PHP的Mcrypt扩展的mcrypt_create_iv, 如果你不指定的话, 默认利用/dev/random(Linux上), 作为随机数产生器. (大概有的同学已经知道缘故原由了, 呵呵, 那就可以略过了)
这里的问题就在于/dev/random, 它的random pool依赖于系统的中断来产生. 当系统的中断数不敷, 不足产生足够的随机数, 那么考试测验读取的进程就会等待, 也便是会hang住, 来看一个大略的例子:
$ dd if=/dev/random bs=1024k count=1
当你的机器不足繁忙的时候, 你会创造, 输出的速率很慢, 偶尔还有停顿…
问题就出在了这里, 当你20个并发要求的时候, 做事器的中断数不足, 产生不了足够的随机数给mcrypt, 继而导致PHP进程等待, 从而表现出, 相应韶光变长
办理的办法便是, 改用/dev/urandom, /dev/urandom也是一个产生随机数的设备, 但是它不依赖于系统中断.
<?php$dmcryptText = \公众dummy\"大众;$key = \"大众foobar\"大众;$size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);$iv = mcrypt_create_iv($size, MCRYPT_DEV_URANDOM); //把稳这里$m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv);var_dump($m);
修正后测试, 问题办理, 统统正常….
然而, 为什么PHP利用/dev/random作为默认, 这是由于理论上来说, /dev/urandom在一定的情形下, 是会被可预测的, 以是大家一样平常认为, /dev/urandom不如/dev/random安全.