(Первоначально этот вопрос назывался «Почему curl_exec() не работает в этом скрипте?» Но, добавив вызовы curl_errno()
и curl_error()
в скрипт, я обнаружил, что проблема была в сертификате, и соответствующим образом отредактировал вопрос. )
Следующий скрипт:
<?php
$sDataFile = '<path>\journal-issue-ToC.htm';
$sURL = 'https://onlinelibrary.wiley.com/toc/14678624/2014/85/1';
$bHeader = false;
$cURLhandle = curl_init();
$FilePointer = fopen($sDataFile, 'wb');
curl_setopt($cURLhandle, CURLOPT_URL, $sURL);
curl_setopt($cURLhandle, CURLOPT_FILE, $FilePointer);
curl_setopt($cURLhandle, CURLOPT_HEADER, $bHeader);
$bResult = curl_exec($cURLhandle);
echo('<br>' . ($bResult === false ? 'Failed to execute' : 'Executed') . ' cURL.');
if (! $bResult) echo('<br>Error #' . curl_errno($cURLhandle) . ': ' . curl_error($cURLhandle));
curl_close($cURLhandle);
fclose($FilePointer);
сохраняет пустой файл «journal-issue-ToC.htm» и генерирует следующий вывод браузера:
Failed to execute cURL.
Error #60: SSL certificate problem: unable to get local issuer certificate
Таким образом, похоже, что cURL сталкивается с проблемой сертификата, которой не происходит, когда я обращаюсь к запрошенный URL в браузере. Что мне нужно знать о сертификатах, чтобы этот скрипт заработал?
Я использую PHP 7.2.2 на IIS 7.5 под 64-разрядной версией Windows 7.
Что мне нужно было знать о сертификатах, чтобы заставить cURL работать, находится в статья на гитхабе, который объясняет необходимость сертификатов в cURL и как их получить и применить:
CURLOPT_CAINFO
и укажите расположение загруженного файла «cacert.pem». После сохранения файла ini перезапустите веб-сервер, чтобы изменения вступили в силу.Я сделал это с несколькими вариантами:
CURLOPT_CAINFO
в функции curl_setopt()
, а не в файле «php.ini».После этого скрипт запустился без ошибок, и выходной файл не был пустым. Но то, что в нем было, все же не то, что мне нужно, что является предметом новый вопрос.