최근 Hacker News API를 조사하는 동안 HTTPS 문제가 발생했습니다. 모든 Hacker News API는 일반 HTTP 프로토콜과 다른 암호화된 HTTPS
프로토콜을 통해 접근하기 때문에 PHP에서 file_get_contents() 함수를 사용하여 API
데이터 입력시 오류가 발생했습니다. 사용된 코드는 다음과 같습니다.
$ data = file_get_contents("https://hacker-news.firebaseio.com/v0/topstories.json?
print=pretty");
......
위 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다.
PHP 경고: file_get_contents(): 래퍼 "https"를 찾을 수 없습니다.
PHP를 구성할 때 활성화하는 것을 잊으셨나요?
왜 이런 오류가 발생하나요?
인터넷에서 검색한 결과 많은 사람들이 이 오류를 발견했습니다. 문제는 매우 직접적입니다.
이 PHP 구성 파일에서 활성화되어 있지 않기 때문입니다. .
매개변수를 활성화합니다. 내 컴퓨터에서는 /apache/bin/php.ini에 있습니다. 확장자=php_openssl.dll 앞에는
을 제거해야 합니다. 측면에 세미콜론. 다음 스크립트를 사용하여 PHP 환경의 구성을 확인할 수 있습니다:
$w = stream_get_wrappers();
echo 'openssl: ', Extension_loaded ('openssl ') ? 'yes':'no', "n";
echo 'http 래퍼: ', in_array('http', $w) ? 'yes':'no', "n";
echo 'https 래퍼: ', in_array('https', $w) ? 'yes':'no', "n";
echo '래퍼: ', var_dump($ w);
위 스크립트 조각을 실행하면 내 컴퓨터의 결과는 다음과 같습니다.
openssl: no
http 래퍼: 예
https 래퍼: 아니요
래퍼: array(10) {
[0]=>
string(3 ) "php"
[1]=>
string(4) "파일"
[2]=>
string(4) " glob"
[3]=>
문자열(4) "데이터"
[4]=>
문자열(4) "http"
[5]=>
string(3) "ftp"
[6]=>
string(3) "zip"
[7]=>
문자열(13) "compress.zlib"
[8]=>
문자열(14) "compress.bzip2"
[9]=>
string(4) "phar"
}
대안
매우 간단합니다. 오류를 찾아서 수정하는 것 어려운 점은 오류를 찾은 후에는 수정할 수 없다는 것입니다. 원래는 이 스크립트 메소드를 원격 호스트에 넣고 싶었지만 원격 호스트의 PHP 구성을 수정할 수 없었습니다. 결과적으로 이 솔루션을 사용할 수 없었는데 동일한 서버에서는 할 수 없습니다. .
이 길은 작동하지 않습니다.
PHP에서 콘텐츠를 가져오는 데 자주 사용하는 또 다른 함수는 컬입니다. 이 함수는 file_get_contents()보다 강력하고 많은 옵션을 제공합니다
매개변수를 선택합니다. HTTPS 콘텐츠에 액세스하는 문제의 경우 사용해야 하는 CURL 구성 매개변수는 다음과 같습니다.
cur_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
보실 수 있습니다 의미상으로 SSL 보안 확인을 무시/건너뛰는 것입니다. 어쩌면 이것은 좋은 습관이 아닐 수도 있지만 일반적인 시나리오에서는
이면 충분합니다.
다음은 HTTPS 콘텐츠에 액세스할 수 있는 Curl로 캡슐화된 함수입니다.
function getHTTPS($url) {
$ch = 컬_init();
컬_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
컬_setopt($ch, CURLOPT_HEADER, false);
컬_setopt($ch , CURLOPT_FOLLOWLOCATION, true);
컬_setopt($ch, CURLOPT_URL, $url);
컬_setopt($ch, CURLOPT_REFERER, $url);
컬_setopt($ch , CURLOPT_RETURNTRANSFER, TRUE);
$result =curl_exec($ch);
curl_close($ch);
return $result;
}