PHP cURL Get Requests

xdragonx

Well-known member
ID: 310927
L
4 März 2008
348
11
Hey,

Ich probiere gerade ein wenig mit cURL herum um später mal was vernüftiges damit zu programmieren. Ich habe zurzeit eigentlich nur ein Problem.

Wenn ich z.B. eine Get Request an https://www.google.de/ schicke und mir per "echo" die Antwort ausgeben lasse, so lädt mein PHP-Skript Google.

Nun werden aber weitere Get Requests vom Browser an Google geschickt. Wie kann ich z.B. die erste Get Request und gleich danach eine zweite losschicken und mir dann erst das Ergebnis ausgeben lassen?

Das Skript dazu würde dann z.B. so aussehen:

PHP:
// Zu besuchende URL
$address = "https://www.google.de/";

// Cookies 
$Pref = "Wert für Cookie PREF";

$NID = "Wert für Cookie NID";

// UserAgent
$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'; 

// erzeuge einen neuen cURL-Handle
$ch = curl_init();


// header zusammensetzen und an CURLOPT_HTTPHEADER übergeben
$header[] = "Host: www.google.de";
$header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$header[] = "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
$header[] = "Accept-Encoding: gzip,deflate";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Keep-Alive: 115";
$header[] = "Connection: keep-alive";
$header[] = "Cache-Control: max-age=0";

// setze die URL und andere Optionen
curl_setopt($ch, CURLOPT_URL, $address);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 25);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
curl_setopt($ch, CURLOPT_REFERER, $address);
curl_setopt($ch, CURLOPT_COOKIE,$Pref.'; '.$NID); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

// Request abschicken und ausgeben
$response = curl_exec($ch);
echo ($response);

//Handle schließen
curl_close($ch)

So ungefähr sieht das Skript aus. Damit ist aber nur eine Get Request abgedeckt. Als erste Get Request an Google schickt der Browser dann

GET /logos/2011/liszt11-hp.jpg HTTP/1.1

Die möchte ich auch per cURL abschicken, sodass diese auch nicht in Live HTTP Headers steht bzw. mein Browser sie abschickt. Jemand eine Ahnung wie man das machen kann?

Gruss xdragonx
 
Du musst die erste Resource verstehen und dann weitere Resourcen laden.

Beispiel:
Du lädst z.B. eine HTML-Datei. Diese verweist mit <link>, <img>, <script>, <iframe>, <style> bzw. CSS-Eigenschaften auf weitere Resourcen, wie Bilder, JavaScript-Dateien, Stylesheets oder anderes. Diese musst du dann entsprechend nachladen, falls du sie nicht im Cache hast (so du einen Cache implementieren willst).

Je nachdem, was du lädst, können Folgerequests anders aussehen. Ein XML-Dokument kann z.B. weitere Requests für XSDs nach sich ziehen, um das XML zu validieren. Ein SVG kann Bilder enthalten, die du nachladen musst.

Besonders interessant ist JavaScript, weil das während der Ausführung weitere Requests nach sich ziehen kann, Stichwort AJAX.

Da ich mir aber kaum vorstellen kann, dass du in PHP einen vollständigen Webbrowser nachbauen wilst, wäre interessant, was du überhaupt vorhast ;)
 
Ein Browser will ich nicht nachbauen, dass wäre viel zu viel Arbeit :biggrin:

Möchte mich erstmal mit cURL ein wenig vertraut machen um zu schauen, was man damit überhaupt alles machen kann.

Deine Antwort ist zwar einleuchtend aber ich hab keine Ahnung wie ich da rangehen soll.

Weitere Requests die sich durch Responses mit Location ergeben müsste ich dann mit
PHP:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
in Verbindung bringen.

Nehmen wir mal an ich möchte nachdem ich die erste Request gesendet habe, eine zweite an "https://clients1.google.de/generate_204" schicken.
Wie würde das dann aussehen?

Die Bilder, Stylesheets, etc. lasse ich dann erstmal vom Browser laden.
 
Zuletzt bearbeitet:
Möchte mich erstmal mit cURL ein wenig vertraut machen um zu schauen, was man damit überhaupt alles machen kann.
cURL sendet einen Request an einen Server und nimmt dir dabei protokollspezifische Sachen ab, z.B. einem Location-Header hinterherzurennen.
Deine Antwort ist zwar einleuchtend aber ich hab keine Ahnung wie ich da rangehen soll.
Was willst du denn tun? In PHP Browserfunktionalität nachzubauen is eh relativ sinnlos, außer, du willst dir bloß Verständnis/Techniken aneignen.

Weitere Requests die sich durch Responses mit Location ergeben müsste ich dann mit
PHP:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
in Verbindung bringen.
Richtig. Antwortet ein Server mit z.B. 301, so kümmert sich cURL drum, an der anderen Stelle erneut nachzufragen.

Du kannst das schön mit Google testen: Wenn du auf google.de verbindest und / anfragst, kriegst du ein 301 auf www.google.de.
Nehmen wir mal an ich möchte nachdem ich die erste Request gesendet habe, eine zweite an "https://clients1.google.de/generate_204" schicken.
Wie würde das dann aussehen?
Analog wie der erste Request. HTTP ist prinzipiell zustandslos. Die Reihenfolge von Requests und deren Inhalt is (aus Protokollsicht) egal. (Natürlich macht es effektiv schon einen Unterschied, ob du z.B. erst ein Login-Formular absendest und danach eine Unterseite des Login-Bereichs anfragst oder andersrum.)
 
Was willst du denn tun? In PHP Browserfunktionalität nachzubauen is eh relativ sinnlos, außer, du willst dir bloß Verständnis/Techniken aneignen.

Wie gesagt, ich möchte zwar keinen Browser nachbauen, aber mit cURL trotzdem aneignen.

Analog wie der erste Request. HTTP ist prinzipiell zustandslos. Die Reihenfolge von Requests und deren Inhalt is (aus Protokollsicht) egal. (Natürlich macht es effektiv schon einen Unterschied, ob du z.B. erst ein Login-Formular absendest und danach eine Unterseite des Login-Bereichs anfragst oder andersrum.)

Okay das ist klar nur wie gebe ich zwei Requests aus? Das abschicken und empfangen ist hier ja dann nicht das Problem. Die Frage ist jetzt wie ich den Inhalt so ausgebe, dass diese beiden Requests "erledigt wurden".
 
Okay das ist klar nur wie gebe ich zwei Requests aus? Das abschicken und empfangen ist hier ja dann nicht das Problem. Die Frage ist jetzt wie ich den Inhalt so ausgebe, dass diese beiden Requests "erledigt wurden".
:hö:
PHP:
echo ($response1);
echo ($response2);
:?: