PHP Workaround – file_get_contents() ohne allow_url_fopen nutzen
Ich 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
