Ich habe diese Funktion gefunden, die einen fantastischen Job macht (IMHO): 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;
}
Das einzige Problem, das ich habe, ist, dass es für https: // nicht funktioniert. Anny Ideen, was ich tun muss, damit dies für https funktioniert? Vielen Dank!
Antworten:
Schnelle Lösung, fügen Sie dies in Ihren Optionen hinzu:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
Jetzt haben Sie keine Ahnung, zu welchem Host Sie tatsächlich eine Verbindung herstellen, da cURL das Zertifikat in keiner Weise überprüft. Ich hoffe, Sie genießen Man-in-the-Middle-Angriffe !
Oder fügen Sie es einfach Ihrer aktuellen Funktion hinzu:
/** * 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; }
quelle
Ich habe versucht, CURL zu verwenden, um einige https-API-Aufrufe mit PHP durchzuführen, und bin auf dieses Problem gestoßen. Ich bemerkte eine Empfehlung auf der PHP-Site, die mich zum Laufen brachte: http://php.net/manual/en/function.curl-setopt.php#110457
quelle
35 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Eine andere Option wie die Antwort von Gavin Palmer ist die Verwendung der
.pem
Datei, jedoch mit einer Curl-OptionLaden Sie die zuletzt aktualisierte
.pem
Datei von https://curl.haxx.se/docs/caextract.html herunter und speichern Sie sie irgendwo auf Ihrem Server (außerhalb des öffentlichen Ordners).Stellen Sie die Option in Ihrem Code anstelle der
php.ini
Datei ein.In deinem Code
curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");
HINWEIS: Das Einstellen des Cainfo
php.ini
wie bei @Gavin Palmer ist besser als das Einstellen in Ihrem Code wie bei mir, da bei jedem Aufruf der Funktion eine Festplatten-E / A gespeichert wird. Ich mache es einfach so, falls Sie es testen möchten die cainfo-Datei im laufenden Betrieb, anstatt siephp.ini
beim Testen Ihrer Funktion zu ändern .quelle
Ein wichtiger Hinweis: Die oben erwähnte Lösung funktioniert nicht auf dem lokalen Host. Sie müssen Ihren Code auf den Server hochladen und dann funktioniert es. Ich habe keinen Fehler erhalten, als eine schlechte Anfrage. Das Problem war, dass ich localhost (test.dev, myproject.git) verwendet habe. Beide oben genannten Lösungen funktionieren. Es wird die Lösung empfohlen, die das SSL-Zertifikat verwendet.
Gehen Sie zu https://curl.haxx.se/docs/caextract.html und laden Sie die neueste Datei cacert.pem herunter. Der Speicher befindet sich irgendwo (nicht im öffentlichen Ordner - funktioniert aber trotzdem)
Verwenden Sie diesen Code
quelle