我在 Windows 服务器上使用 cURL 和 PHP 时遇到了一个奇怪的问题。我有一个非常基本的代码用于测试这个问题(几乎直接来自 php cURL 手册页):
<?php
// In this example we are referring to a page that handles html
$headers = array( "Content-Type: text/html");
// Initialise Curl
$curl = curl_init();
if ($curl === false)
throw new Exception(' cURL init failed');
// Configure curl for website
curl_setopt($curl, CURLOPT_URL, "https://google.com");
// Set up to view correct page type
curl_setopt($curl, CURLOPT_HTTPHEADER, &$headers);
// Turn on SSL certificate verfication
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
// Tell the curl instance to talk to the server using HTTP GET
curl_setopt($curl, CURLOPT_HTTPGET, 1);
// 1 second for a connection timeout with curl
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
// Try using this instead of the php set_time_limit function call
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
// Causes curl to return the result on success which should help us avoid using the writeback option
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if( ! $result = curl_exec($curl))
$result = curl_error($curl);
curl_close($curl);
echo var_dump($result);
?>
抱歉代码转储,但它是非常基本的代码,它所做的只是尝试使用 HTTPS (SSL) 获取 google.com 站点。
问题是第一次调用这个脚本时,响应总是这样:string(22) "SSL connection timeout"。
对脚本的后续调用会输出所需的结果,但是,如果我在再次调用脚本之前等待几分钟,则会再次发生超时问题。
因此,重现“错误”的步骤:
- 调用脚本 -> 超时
- 再次调用脚本-> 工作正常
- 再次调用脚本-> 工作正常
- 再调用脚本 n 次 -> 工作正常
- 等待 10 分钟
- 调用脚本 -> 超时
- 再次调用脚本 n 次 -> 工作正常
如果我调用任何其他脚本,即使在一段时间不活动之后也会立即响应,因此这种行为仅在涉及 cURL 时才会发生。
所有组件都运行最新的稳定版本,包括 PHP、cURL、OpenSSL 等。服务器运行 Windows 2012 和 IIS 8,最新升级,在 FastCGI 上运行 PHP。
有谁知道我该如何解决这个问题?目前我有一个每 5 分钟运行一次的 cron 作业并调用上面的脚本来刷新 cURL,但这感觉就像一个 hack :(
谢谢。