PHP - Alternative für file get contents() bei deaktivierten allow url fopen

Aus Laub-Home.de Wiki
Zur Navigation springen Zur Suche springen

Bei vielen Hostern ist allow_url_fopen zwecks Security deaktiviert; entsprechend kann somit über file_get_contents() kein externer Content geladen werden. Eine Abhilfe kann hier die Verwendung von cURL sein.
Vorraussetzung hierfür ist, dass PHP mit der entsprechenden cURL Unterstützung zurecht kommt - dies ist in der Ausgabe von phpinfo() ersichtlich oder in der CLI:

# php -i|grep -i curl
Additional .ini files parsed => /etc/php5/cli/conf.d/curl.ini,
curl
cURL support => enabled
cURL Information => 7.21.0


Um via cURL den externen Content zu laden, kann eine einfache Hilfsfunktion implementiert werden:

function getContent($url) {
	if (ini_get('allow_url_fopen')) {
		$opts = array(
				'http'=> array(
						'method'=> "GET",
						'header'=> "Accept-language: en\r\n" .
					//	"User-Agent: "  . microtime() . "\r\n" .
					//	"Referer: "     . microtime() . "\r\n"
					)
				);
		return file_get_contents($url,  false, stream_context_create($opts));
	} elseif (function_exists('curl_init')) {
		$curlObj = curl_init();
		curl_setopt_array($curlObj, array(
						CURLOPT_URL             => $url,
						CURLOPT_RETURNTRANSFER  => 1,
						CURLOPT_HEADER          => 0,
						CURLOPT_SSL_VERIFYHOST  => 0,
						CURLOPT_SSL_VERIFYPEER  => 0,
					//	CURLOPT_USERAGENT       => microtime(),
					//	CURLOPT_REFERER         => microtime()
					));
		$content = curl_exec($curlObj);
		curl_close($curlObj);
		return $content;
	} else {
		die('fetch error');
	}
}

echo getContent('http://wiki.laub-home.de');



* Sofern der externe Server die Anfragen anhand der Referer/ UserAgents einschränkt, muss hier eine Anpassung erfolgen. Zum Beispiel hilft die oben gezeigte microtime() Zuweisung um Überprüfungen der Form "zuviele Anfragen vom gleichen Client; identifiziert anhand Referer & UserAgent" zu überwinden. Durch weitere Anpassungen können natürlich noch diverse Header in die Anfragen eingebaut werden.