최근 Hacker News API를 조사하는 동안 HTTPS 문제가 발생했습니다. 모든 Hacker News API는 일반 HTTP 프로토콜과 다르게 암호화된 HTTPS 프로토콜을 통해 접근하기 때문에, API에서 제공하는 데이터를 얻기 위해 PHP에서 file_get_contents()
함수를 사용할 때 사용되는 코드는 다음과 같습니다. :
<?php<br />$data = file_get_contents("<a href="https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty">https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty</a>");<br />......
위 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다.
PHP Warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
다음은 스크린샷입니다.
왜 이런 오류가 발생하나요?
인터넷에서 검색한 결과 많은 사람들이 이 오류를 발견했습니다. PHP 구성 파일에 활성화된 매개 변수가 없기 때문에 문제는 매우 직접적입니다. 내 로컬 컴퓨터에서는 /apache/bin/php.ini
입니다. 🎜> 이 항목의 경우 앞의 세미콜론을 제거해야 합니다. 다음 스크립트를 사용하여 PHP 환경 구성을 확인할 수 있습니다. ;extension=php_openssl.dll
$w = stream_get_wrappers();<br />echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n";<br />echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";<br />echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";<br />echo 'wrappers: ', var_dump($w);
openssl: no<br />http wrapper: yes<br />https wrapper: no<br />wrappers: array(10) {<br /> [0]=><br> string(3) "php"<br> [1]=><br> string(4) "file"<br> [2]=><br> string(4) "glob"<br> [3]=><br> string(4) "data"<br> [4]=><br> string(4) "http"<br> [5]=><br> string(3) "ftp"<br> [6]=><br> string(3) "zip"<br> [7]=><br> string(13) "compress.zlib"<br> [8]=><br> string(14) "compress.bzip2"<br> [9]=><br> string(4) "phar"<br>}
대안
오류를 찾아서 수정하는 것은 매우 간단합니다. 어려운 점은 오류를 찾은 후에는 수정할 수 없다는 것입니다. 원래는 이 스크립트 메소드를 원격 호스트에 넣고 싶었지만 원격 호스트의 PHP 구성을 수정할 수 없었습니다. 결과적으로 이 솔루션을 사용할 수 없었지만 우리는 나무에 매달릴 수 없었습니다. 이 도로는 작동하지 않습니다. 다른 방법이 있나요?내가 PHP에서 콘텐츠를 캡처하는 데 자주 사용하는 또 다른 기능은
입니다. curl
보다 더 강력하고 많은 선택적 매개변수를 제공합니다. file_get_contents()
콘텐츠 액세스 문제의 경우 사용해야 하는 HTTPS
구성 매개변수는 다음과 같습니다. CURL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
다음은 HTTPS 콘텐츠에 접근할 수 있는
으로 캡슐화된 함수입니다. Curl
function getHTTPS($url) {<br> $ch = curl_init();<br> curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);<br> curl_setopt($ch, CURLOPT_HEADER, false);<br> curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br> curl_setopt($ch, CURLOPT_URL, $url);<br> curl_setopt($ch, CURLOPT_REFERER, $url);<br> curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);<br> $result = curl_exec($ch);<br> curl_close($ch);<br> return $result;<br>}