Как исправить тайм-аут соединения cURL SSL, который происходит только при первом вызове сценария

У меня возникла странная проблема с использованием cURL с PHP на сервере Windows. У меня есть очень простой код, который я использую, чтобы проверить эту проблему (довольно прямо на странице руководства 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); ?> 

Извините за дамп кода, но это довольно простой код, и все, что он делает, это попытаться получить сайт google.com с помощью HTTPS (SSL).

Проблема в том, что при первом вызове этого сценария ответ всегда таков: строка (22) «Тайм-аут SSL-соединения».

Последующие вызовы сценария выводят желаемый результат, но если я подождал пару минут до вызова сценария снова, проблема с таймаутом повторится.

Итак, шаги по воспроизведению «ошибки»:

  1. Вызвать скрипт -> таймауты
  2. Снова вызовите скрипт -> отлично работает
  3. Вызовите сценарий еще раз -> отлично работает
  4. Вызовите скрипт еще несколько раз -> отлично работает
  5. Подождите 10 минут
  6. Вызвать скрипт -> таймауты
  7. Снова вызовите скрипт еще раз -> отлично работает

Если я вызову любой другой скрипт, ответ будет незамедлительным даже после периода бездействия, поэтому это поведение произойдет только тогда, когда задействован cURL.

Все компоненты работают с последней стабильной версией, включая PHP, cURL, OpenSSL и т. Д. На сервере работает Windows 2012 с IIS 8, последние обновления, запуск PHP на FastCGI.

Кто-нибудь знает, как я могу это решить? В настоящее время у меня есть работа cron, работающая каждые 5 минут, и вызов сценария выше, чтобы обновить cURL, но это похоже на взлом 🙁

Благодарю.