2

Windows サーバーで PHP を使用して cURL を使用すると、奇妙な問題に直面しています。この問題をテストするために使用している非常に基本的なコードがあります (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 などを含む最新の安定したバージョンを実行しています。サーバーは IIS 8、最新のアップグレード、FastCGI で PHP を実行する Windows 2012 を実行しています。

どうすればこれを解決できるかについて誰か考えがありますか? 現在、5分ごとに実行されているcronジョブがあり、上記のスクリプトを呼び出してcURLを更新していますが、それはハックのように感じます:(

ありがとう。

4

0 に答える 0