2

我在 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"。

对脚本的后续调用会输出所需的结果,但是,如果我在再次调用脚本之前等待几分钟,则会再次发生超时问题。

因此,重现“错误”的步骤:

  1. 调用脚本 -> 超时
  2. 再次调用脚本-> 工作正常
  3. 再次调用脚本-> 工作正常
  4. 再调用脚本 n 次 -> 工作正常
  5. 等待 10 分钟
  6. 调用脚本 -> 超时
  7. 再次调用脚本 n 次 -> 工作正常

如果我调用任何其他脚本,即使在一段时间不活动之后也会立即响应,因此这种行为仅在涉及 cURL 时才会发生。

所有组件都运行最新的稳定版本,包括 PHP、cURL、OpenSSL 等。服务器运行 Windows 2012 和 IIS 8,最新升级,在 FastCGI 上运行 PHP。

有谁知道我该如何解决这个问题?目前我有一个每 5 分钟运行一次的 cron 作业并调用上面的脚本来刷新 cURL,但这感觉就像一个 hack :(

谢谢。

4

0 回答 0