最近、Hacker News API を調査中に HTTPS の問題に遭遇しました。すべての Hacker News API は、通常の HTTP プロトコルとは異なる暗号化された HTTPS
プロトコルを介してアクセスされるため、API で提供されるデータを取得するために PHP の関数 file_get_contents() を使用すると、エラーが発生します
使用されるコードは次のとおりです:
$data = file_get_contents("https://hacker-news.firebaseio.com/v0/topstories.json?
print=pretty " );
....
上記のコードを実行すると、次のエラー メッセージが表示されます:
PHP 警告: file_get_contents(): ラッパー "https " が見つかりません- PHP を設定したときに有効にするのを忘れましたか?
このエラーはなぜ発生しますか?
インターネットで検索したところ、多くの人がこのエラーに遭遇していることがわかりました。私のマシンでは、PHP 設定ファイルに
enabled パラメータがないためです。 /apache/bin/php.ini の項目 ;extension=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 'wrappers: ', var_dump($w);
上記のスクリプト スニペットを実行すると、私のマシンでの結果は次のようになります:
openssl: no
http ラッパー: はい
https ラッパー: いいえ
wrappers: array(10) {
[0]=>
string(3) "php"
[1]= >
string(4) "ファイル"
[2]=>
string(4) "glob"
[3]=>
string(4) "データ"
[4]=>
string( 4) "http"
[5]=>
string(3) "ftp"
[6]=>
string(3) "zip"
[7]=>
string (13) "compress.zlib"
[8]=>
string(14) "compress.bzip2"
[9]=>
string(4) "phar"
}
代替手段
Itエラーを見つけて修正するのは非常に簡単ですが、難しいのは、エラーを見つけた後に修正できないことです。当初はこのスクリプト メソッドをリモート ホストに配置したかったのですが、リモート ホストの PHP 構成を変更できなかったので、このソリューションは使用できませんでしたが、ツリーにハングアップすることはできません。 、この道は死んでいます。別の道があるかどうか確認してください。
PHP でコンテンツをキャプチャするためによく使用するもう 1 つの関数は、file_get_contents() よりも強力で、多くのオプションのパラメーターを提供します。 HTTPS コンテンツへのアクセスの問題については、使用する必要がある CURL 構成パラメーターは次のとおりです:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
セマンティクスから、SSL セキュリティ検証を無視/スキップすることがわかります。これは良い習慣ではないかもしれませんが、通常のシナリオ
では、これで十分です。
以下は、HTTPS コンテンツにアクセスできる Curl によってカプセル化された関数です。
function getHTTPS($url) {
$ch =curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT _REFERER, $url) ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result =curl_exec($ch);
curl_close($ch);
return $result;
}