Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cURL/PHP请求执行的时间占50%_Php_Ssl_Curl_Ubuntu 10.04 - Fatal编程技术网

cURL/PHP请求执行的时间占50%

cURL/PHP请求执行的时间占50%,php,ssl,curl,ubuntu-10.04,Php,Ssl,Curl,Ubuntu 10.04,在到处搜索之后,我不明白为什么在我的情况下,向支持SSL的远程主机发出的cURL请求只有50%左右的时间成功。情况是这样的:在使用PHPCLI运行的单个PHP脚本中,我有一系列cURL请求,所有这些请求都发送到HTTPS远程主机。有时,当我运行脚本时,请求会成功执行,但由于某些原因,大多数时候我运行脚本时,从cURL中得到以下错误: * About to connect() to www.virginia.edu port 443 (#0) * Trying 128.143.22.36...

在到处搜索之后,我不明白为什么在我的情况下,向支持SSL的远程主机发出的cURL请求只有50%左右的时间成功。情况是这样的:在使用PHPCLI运行的单个PHP脚本中,我有一系列cURL请求,所有这些请求都发送到HTTPS远程主机。有时,当我运行脚本时,请求会成功执行,但由于某些原因,大多数时候我运行脚本时,从cURL中得到以下错误:

* About to connect() to www.virginia.edu port 443 (#0)
*   Trying 128.143.22.36... * connected
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac
* Closing connection #0
如果我再尝试几次,我会得到相同的结果,但尝试几次后,请求将成功通过。之后再次运行脚本将导致错误,并且模式将继续。研究错误“alert bad record mac”并没有给我任何帮助,我也不愿意将其归咎于SSL问题,因为脚本仍然偶尔运行


我在Ubuntu服务器10.04上,安装了php5和php5curl,以及最新版本的openssl。就cURL特定选项而言,CURLOPT_SSL_VERIFYPEER设置为false,CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT都设置为4秒。进一步说明这个问题的是,在我的Mac OS X dev机器上也发生了同样的情况——请求只经过约50%的时间。

远程主机可能不是真正唯一的主机。也许这是一种负载平衡解决方案,由多台服务器接收传入的请求。 让我觉得可能是错误消息中的“mac错误”。这可能意味着在SSL协商仍在运行时远程主机mac地址已更改。这可以解释为什么有时候你没有任何问题

但可能不是:-)SSL问题很难找到


我不理解您关于prefork MPM与Worker MPM的回答,如果您在cli模式下运行PHP,您的apache MPM未被使用,您甚至没有使用apache。

您可能需要此选项:

禁止重复使用

过一段很长的时间。设置为1可使下一次传输在完成时显式关闭连接。通常情况下,libcurl在完成一次传输时会保持所有连接的活动状态,以防后续的一次传输会重复使用它们。使用此选项时应谨慎,且仅当您了解它的功能时。设置为0,使libcurl保持连接打开,以便以后可能重新使用(默认行为)。

您尝试过吗?
卷曲设置($handle,卷曲设置,3)

你可能想要谷歌“错误140943FC”相信我,我做到了。我甚至检查了一下,以确保我在prefork MPM中运行的是Apache,而不是worker threads,因为worker threads版本(我已经在运行prefork,所以它没有帮助)显然导致了与此相关的错误。坏记录MAC不指网络接口的MAC地址。它提到了“消息身份验证码”的问题,感谢您的建议,但没有用。我以前尝试过CURLOPT_FRESH_CONNECT,但没有成功,禁止重用导致了相同的旧行为。好的一点,负载平衡的远程主机在我的情况下是有意义的。为了解决这个问题,我决定阻止它,直到我能得到一个有效的、非错误的curl响应并从那里开始。我现在得到的最好的。我不认为MAC和网络MAC地址有任何关系。它代表消息身份验证代码:。。。这使我得出结论,“远程主机mac地址”的更改与此问题无关,反之亦然。@Charles Oliver Nutter很好地回答了这个问题,但这可能仍然是主机之间应该共享的东西(ssl缓存?)的问题,而这不是。