PHP und HTTPS

巴扎黑
巴扎黑Original
2016-11-11 11:47:581503Durchsuche

Bei meiner Recherche zur Hacker News API bin ich kürzlich auf ein HTTPS-Problem gestoßen. Da auf alle Hacker-News-APIs über das verschlüsselte HTTPS

-Protokoll zugegriffen wird, das sich vom gewöhnlichen HTTP-Protokoll unterscheidet, wird bei Verwendung der Funktion file_get_contents() in PHP der Zugriff auf den bereitgestellten Inhalt verwendet API Bei der Dateneingabe

ist ein Fehler aufgetreten. Der verwendete Code lautet wie folgt:

$ data = file_get_contents("https://hacker-news.firebaseio.com/v0/topstories.json?

print=pretty");

......

Beim Ausführen des obigen Codes wird die folgende Fehlermeldung angezeigt:

PHP-Warnung: file_get_contents(): Der Wrapper „https“ konnte nicht gefunden werden – haben Sie vergessen, ihn zu aktivieren?

Warum tritt dieser Fehler auf?

Nach einiger Suche im Internet habe ich festgestellt, dass viele Leute auf diesen Fehler gestoßen sind. Das Problem ist sehr direkt, da

in der PHP-Konfigurationsdatei nicht aktiviert ist .

Aktivieren Sie einen Parameter. Auf meinem Computer befindet er sich in /apache/bin/php.ini. Der Erweiterung=php_openssl.dll muss

vorangestellt werden Semikolon an der Seite. Sie können das folgende Skript verwenden, um die Konfiguration Ihrer PHP-Umgebung zu überprüfen:

$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);

Beim Ausführen des obigen Skriptausschnitts ist das Ergebnis auf meinem Computer:

openssl: no

http Wrapper: ja

https Wrapper: nein

Wrapper: 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"

}

Alternativen

Es ist ganz einfach Fehler zu finden und zu korrigieren. Das Schwierige ist, dass man die Fehler nicht korrigieren kann, nachdem man sie gefunden hat. Ich wollte diese Skriptmethode ursprünglich auf dem Remote-Host installieren, konnte die PHP-Konfiguration des Remote-Hosts jedoch nicht ändern. Daher konnte ich diese Lösung nicht verwenden, aber wir können sie nicht auf demselben Server ausführen .

Dieser Weg wird nicht funktionieren.

Eine weitere Funktion, die ich häufig zum Abrufen von Inhalten in PHP verwende, ist curl. Sie ist leistungsfähiger als file_get_contents() und bietet viele Optionen

Parameter auswählen. Für das Problem des Zugriffs auf HTTPS-Inhalte müssen wir folgende CURL-Konfigurationsparameter verwenden:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

Sie können es sehen Semantisch gesehen ignoriert/überspringt es die SSL-Sicherheitsüberprüfung. Vielleicht ist dies keine gute Vorgehensweise, aber für normale Szenarien

reicht das aus.

Das Folgende ist eine von Curl gekapselte Funktion, die auf HTTPS-Inhalte zugreifen kann:

Funktion 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;

}

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn