HTTPS Web ページのコンテンツをクロールする PHP メソッドとエラー処理
最近、Hacker News API を調査中に HTTPS の問題に遭遇しました。すべての Hacker News API は通常の HTTP プロトコルとは異なる暗号化された HTTPS プロトコルを介してアクセスされるため、PHP の関数 file_get_contents() を使用して API で提供されるデータを取得すると、次のコードがエラーになります。 :
<?php $data = file_get_contents("https://www.scutephp.com"); ......
上記のコードを実行すると、次のエラー メッセージが表示されます:
PHP Warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
このエラーはなぜ発生しますか?
インターネットで検索すると、多くの人がこのエラーに遭遇していることがわかりました。これは、私のローカル マシンの /apache/ で有効なパラメータがないことが原因です。 bin/php .ini 内の項目 ;extension=php_openssl.dll では、先行するセミコロンを削除する必要があります。次のスクリプトを使用して、PHP 環境の構成を確認できます:
$w = stream_get_wrappers(); echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n"; echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n"; echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n"; echo 'wrappers: ', var_dump($w);
上記のスクリプト スニペットを実行すると、私のマシンでの結果は次のようになります:
openssl: no http wrapper: yes https wrapper: no wrappers: array(10) { [0]=> string(3) "php" [1]=> string(4) "file" [2]=> string(4) "glob" [3]=> string(4) "data" [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" }
代替案
エラーを見つけて修正するのは非常に簡単です。難しいのは、エラーを見つけた後は修正できないことです。当初はこのスクリプト メソッドをリモート ホストに配置したかったのですが、リモート ホストの 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; }