Es gibt mehrere Möglichkeiten um den Inhalt einer Datei mit PHP auszulesen. Ich möchte heute auf file_get_contents() und cURL näher eingehen, bzw. beide miteinander vergleichen.
file_get_contents()
Die Funktion file_get_contents() liest die gesamte zu ladende Datei und gibt den Inhalt in einem String zurück. Der folgende Code-Schnipsel liest den Inhalt von galuba dot net in die Variable $str ein und gibt diesen anschliessend aus.
$str = file_get_contents('http://www.galuba.net/');
echo $str;
Das ist soweit kein Problem, möchtet ihr aber jetzt eine Datei mit file_get_contents() von einem fremden Server laden, werden euch mit großer Wahrscheinlichkeit die Sicherheitseinstellungen von PHP eine Strich durch die Rechnung machen. Da in den meisten Fällen die Funktion file_get_contents() so eingeschränkt wird, das nur lokale Dateien geladen werden dürfen.
cURL
Anders sieht hier mit den cURL-Funktionen aus, damit gelingt es auch Dateien von fremden Server zu laden. Zudem gibt es hier eine Fülle von Einstellungen mit denen die Funktion file_get_contents() nicht mithalten kann. Die unten beschriebene Funktion get_data() baut eine Verbindung zur übergebenen URL auf und gibt die geladenen Datei als String $data zurück. In der Variable $timout wird festgelegt nach wie vielen Sekunden der Verbindungsaufbau als gescheitert angesehen werden soll.
function get_data($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
// Aufruf der Funktion get_data
$str = get_data('http://www.galuba.net');
Geschwindigkeitsvergleich
Um einen, wenigstens in etwa genauen Geschwindigkeitsvergleich zu bekommen, habe ich jeden Durchlauf insgesamt fünf Mal wiederholt und daraus den Mittelwert errechnet. Anhand dieser Ergebnisse kann ich zumindest für meinen Server sagen, das die Daten mit cURL um einiges schneller geladen werden wie mit file_get_contents().
| Durchläufe | cURL | file_get_contents() |
|---|---|---|
| 1 | 0.93305302 | 1.36109495 |
| 10 | 9.18296003 | 10.74049711 |
| 100 | 94.02498293 | 145.49945712 |
Fazit
Ich setze bei derartigen Anforderungen nur noch die cURL-Funktionen ein, zum Einen wegen der höheren Kompatiblität zu den meisten Systemen und den vielseitigen Optionen und zum Anderen wegen des Geschwindigkeitsvorteils gegenüber file_get_contents().