【问题标题】:Google Recaptcha file_get_contents(): Failed to enable cryptoGoogle Recaptcha file_get_contents():无法启用加密
【发布时间】:2026-01-17 08:05:02
【问题描述】:

我正在使用 Google Recaptcha 库 (https://github.com/google/recaptcha) 来确认表单提交。这几个月来一直运行良好。突然间,我开始注意到很多错误,例如:

ErrorException: file_get_contents(): Failed to enable crypto in /vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php:68

(从 \ReCaptcha\ReCaptcha::verify 调用) 这个异常可以通过一个简单的请求(在库之外)间歇性地复制:

file_get_contents('https://www.google.com/recaptcha/api/siteverify');

当它出错时,大约需要 52 秒超时才会显示错误,否则立即成功。不知道这个超时值是从哪里来的。较早的帖子表明此错误与 SSL3 有关(它不是 - 显然 Google 没有使用它,它使用 TLS 1.2)。我也尝试过使用最新的 cacerts.pem 文件(来自 curl),但问题仍然存在。

使用 curl(来自 PHP 或 cli)拉取该 URL 也没有问题。

服务器在 Ubuntu 14.04 上运行 PHP 7.1.3。我确实没有在我的本地机器上遇到这个问题,在 Ubuntu 16.10 上运行相同的 PHP,所以我想知道这是否有某种关联。我在这里真的很茫然。我知道我可以分叉库并重写它以使用 curl 而不是 file_get_contents,但这似乎充其量是一种解决方法。

【问题讨论】:

  • 今天我遇到了完全相同的问题(尽管是 PHP 5)。你找到解决方案了吗?
  • @MrCarrot,尝试在您的php.ini 中设置default_socket_timeout=360 看看是否有帮助
  • 你的服务器的操作系统是什么?有可能是网络问题吗?也许这是相关的? *.com/questions/26148701/…
  • 一开始,您可以设置超时并重试(例如 3 次): 正确设置超时而不会弄乱 ini 值:` 数组(“超时”=> 1))); file_get_contents("example.com", 0, $ctx); ?>`
  • 启动 tcpdump 并记录网络通信。可能是您有防火墙干扰,达到了 Google 施加的某些限制等。

标签: php ssl recaptcha


【解决方案1】:

我会减少超时,因为用户不能等待 52 秒,就让它失败。

有时事情会失败,这没什么大不了的,只要您发现错误并向用户显示“软”错误即可。

问题是在事情失败时让用户等待,我认为这并不能传达良好的用户体验。

【讨论】: