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".
スクリプトへの後続の呼び出しは目的の結果を出力しますが、スクリプトを再度呼び出す前に数分待つと、タイムアウトの問題が再び発生します。
したがって、「エラー」を再現する手順は次のとおりです。
- スクリプトを呼び出す -> タイムアウト
- スクリプトを再度呼び出します->正常に動作します
- スクリプトをもう一度呼び出します -> 正常に動作します
- スクリプトをさらに n 回呼び出す -> 正常に動作する
- 10分待ちます
- スクリプトを呼び出す -> タイムアウト
- スクリプトをもう一度 n 回呼び出す -> 正常に動作する
他のスクリプトを呼び出すと、非アクティブな期間が経過した後でもすぐに応答するため、この動作は cURL が関係している場合にのみ発生します。
すべてのコンポーネントは、PHP、cURL、OpenSSL などを含む最新の安定したバージョンを実行しています。サーバーは IIS 8、最新のアップグレード、FastCGI で PHP を実行する Windows 2012 を実行しています。
どうすればこれを解決できるかについて誰か考えがありますか? 現在、5分ごとに実行されているcronジョブがあり、上記のスクリプトを呼び出してcURLを更新していますが、それはハックのように感じます:(
ありがとう。