2017年3月

PHP 7.0.16 在阿里云容器服务中Could not gather sufficient random data问题的解决办法

最近一个在公司内部环境测试正常的PHP7.0.16容器发布到阿里云容器服务后,调用random_bytes函数回报Could not gather sufficient random data错误。上网搜了一圏看到是这个Patch导致的。如果PHP在新版系统内核中编译,PHP会使用新版内核中提供的getrandom调用来取得随机数,而不会读取/dev/urandom,如果把它移到旧版内核的系统上运行,random_intrandom_bytes函数就会报Could not gather sufficient random data。

阿里云的容器服务默认用的是Ubuntu 14.04 3.13.60-generic版本的内核,我的PHP容器是在Ubuntu 16.04 4.9.12-moby内核中编译构建的,所以会触发这个问题。解决方法是升级阿里云的容器服务节点,把内核升级到4.x之后此问题就没有发生了。希望未来的PHP版本会提供getrandom失败后的fallback方案。