PHP Workaround – file_get_contents() ohne allow_url_fopen nutzen

php_artikel_logoIch gebe zu, der Titel ist etwas irreführend. Die PHP-Funktion file_get_contents(), die dazu genutzt werden kann Dateien aus dem Internet in einen String zu lesen, um sie weiterzuverarbeiten, funktioniert bei deaktiviertem allow_url_fopen einfach nicht. Daran wird auch dieser Artikel nichts ändern.

Entwickelt man jedoch eine Anwendung/ein Script, das auf möglichst vielen Serverumgebungen funktionieren soll, so wie zum Beispiel ein WordPress-Plugin, so gibt es einen guten Workaround, um Nutzer, auf dessen Webservern allow_url_fopen deaktiviert ist, nicht auszuschließen.
Und genau dieses kleine Snippet möchte ich euch heute zeigen und erklären.

$datei = "http://www.beispiel.de/meine_seite.php";
if (function_exists('curl_version'))
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $datei);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$content = curl_exec($curl);
	curl_close($curl);
}
else if (file_get_contents(__FILE__) && ini_get('allow_url_fopen'))
{
	$content = file_get_contents($datei);
}
else
{
	echo 'Sie haben weder cURL installiert, noch allow_url_fopen aktiviert. Bitte aktivieren/installieren allow_url_fopen oder Curl!';
}

Zuerst wird überprüft, ob auf dem Server die cURL Erweiterung zur Verfügung steht. Wenn dies der Fall ist, wird die Datei per cURL geladen.
Steht cURL nicht zur Verfügung, so wird überprüft, ob allow_url_fopen aktiviert ist. Ist dies der Fall, wird die Datei per file_get_contents() geladen.
Stehen beide Möglichkeiten nicht zur Verfügung, wird eine Fehlermeldung ausgegeben, was den Endanwender vor etwaigen, für ihn “kryptischen”, Fehlermeldungen bewahren soll.

Falls ihr euch fragt, warum ich cURL den Vorzug gegenüber file_get_contents() gebe, so liegt das daran, dass ich die Erfahrung gemacht habe, dass cURL, bezogen auf diesen Anwendungsfall, etwas performanter ist.

Abschließend lässt sich sagen, dass ihr bei Verwendung der hier aufgezeigten Methode, die Chance darauf, dass euer Script bei möglichst vielen Usern läuft, verdoppeln könnt. Das ist doch schon mal was, oder?

Was haltet ihr von meinem Snippet? Würdet ihr es genauso umsetzen oder haltet ihr davon eher nichts? Wie geht ihr mit der “Problematik” allow_url_fopen um?

Viele Grüße,
Raffi

7 Kommentare

  1. andreassays:

    quote: .. Wenn du vielleicht Teile deines Codes postest, könnte ich mal einen Blick drüber werfen ..

    Generell koennte jeder, der ein Fehler in seinem php script “dein_script.php” vermutet , error_reporting(E_ALL); mit einem Umweg, zum Test, einschalten:
    Das funktioniert indem es nicht direkt aufgerufen wird, sondern mit folgendem code snippet include /d und indirekt aufgerufen wird, um selbst die Fehler schon zu sehen:

  2. Danke für die Lösung! Hat einiges an Zeit gespart und löst mein Problem! :)

  3. Axelsays:

    Bei mir erscheint komischerweise nur eine weiße Seite…

    • Bei welchem Versuch? Welche URL, welche Methode? Wenn du vielleicht Teile deines Codes postest, könnte ich mal einen Blick drüber werfen und bei mir testen.

  4. Hallo – vielen Dank für diese Lösung, hat mir viel Arbeit erspart ;-)

    Hatte auch Probleme mit Kundenservern, auf denen sich der Provider beharrlich weigert, allow_url_fopen zu erlauben,

    Gert

  5. Pyrazosays:

    Ich möchte mich auch ganz herzlich für dieses Snippet bedanken. Auf einem Kundenserver wurde allow_url_fopen auch deaktiviert und ich musste eine XML-Datei einlesen. Dank deiner Lösung konnte ich das nun ohne Probleme machen, Vielen Dank!

  6. Vielen Dank – genau das was ich gesucht habe. Hatte allow_url_fopen aus Sicherheitsgründen deaktiviert und musste nun eine andere Lösung finden. cURL funktioniert da einwandfrei

    LG Jürgen

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.