素晴らしい仕事をするこの機能を見つけました(私見): http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
私が抱えている唯一の問題は、https://では機能しないことです。 httpsでこの作業を行うために必要なことはありますか?ありがとう!
クイックフィックス、これをオプションに追加します:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
CURLは証明書を検証しないため、実際に接続しているホストがわかりません。お楽しみください 中間者攻撃 !
または、現在の関数に追加するだけです:
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false // Disabled SSL Cert checks
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
CURLを使用してphpでhttps API呼び出しを実行しようとしていたときに、この問題に遭遇しました。私はphpサイトで私を立ち上げて実行している推奨事項に気付きました: http://php.net/manual/en/function.curl-setopt.php#110457
CURLOPT_SSL_VERIFYPEERのfalseまたは0への設定を停止してください。PHPインストールに最新のCAルート証明書バンドルがない場合は、curlウェブサイトでダウンロードしてサーバーに保存してください。
http://curl.haxx.se/docs/caextract.html
次に、php.iniファイルにパスを設定します。 Windowsの場合:
curl.cainfo = c:\ php\cacert.pem
CURLOPT_SSL_VERIFYPEERをオフにすると、中間者(MITM)攻撃が許可されますが、これは望ましくありません!
Gavin Palmerの回答のような別のオプションは、.pem
ファイルを使用することですが、curlオプションを使用することです
https://curl.haxx.se/docs/caextract.html から最後に更新された.pem
ファイルをダウンロードし、サーバーのどこかに(パブリックフォルダーの外に)保存します。
php.ini
ファイルの代わりにコードでオプションを設定します。
あなたのコードで
curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");
注:@Gavin Palmerがしたようにphp.ini
にcainfoを設定することは、ディスクを保存するため、コードに設定するよりも優れていますIO関数が呼び出されるたびに、関数のテスト中にphp.ini
を変更するのではなく、その場でcainfoファイルをテストしたい場合にこのようにします。