Gör HTTP koppling mot en server via PHP
Förord
Denna artikel kan vara till hjälp om man exempelvis vill hämta eller skicka data till/från en annan webserver. XML-RPC fungerar ungefär enligt denna princip. Denna artikel går igenom en funktion för att hämta hem data från en sida, i detta fall gör vi en sökning på Google. Kör PHPINFO() på webservern för att kontrollera om du kan köra med sockets, om inte så måste det kanske konfigureras i PHP.INI. I en linux miljö måste man kompliera in PHP med --with-sockets.
Fördefinierade variabler
Först definierar vi målet i variabeln $url. Just i det här fallet ska vi göra en sökning på Google så vi sätter också $searchword till "php". Om du tänkt skicka in nånting mer avancerat kan det vara en ide att köra urlencode på det du skickar in.
$searchword = "php";
$url = "http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=". $searchword ."&btnG=Google+Search";
Denna funktion returnerar de olika delarna i variabeln $url.
$url_data = parse_url ( $url );
Vi separerar variablarna, detta för att de ska skickas in lite olika. $host är själva domänen, i detta fallet skulle det vara "www.google.com", $path är det som är efter $host i strängen, i detta fallet skulle det bli "search". $query är datan som vi skickar in till sidan, i detta fallet är det "hl=en&ie=UTF-8&oe=UTF-8&q=php&btnG=Google+Search"".
$host = $url_data['host'];
$path = $url_data['path'];
$query = $url_data['query'];
Skapa en koppling mot servern
Här skapar vi upp en koppling till servern, vi använder port 80 som är standard för webservrar, $errno och $errstr sätter vilka variablar som ska returnera eventuella felmeddelanden. Den sista variabeln in till fsockopen är timeout i sekunder.
$sock = fsockopen ($host, 80, $errno, $errstr, 15);
Kontrollera kopplingen
Här kontrollerar vi om vi fått någon koppling mot servern, $errno och $errstr returnerar vad som gick fel.
// * * Kontrollera om kopplingen lyckades.
if (!$sock) {
echo("Error (". $errno .") : ". $errstr);
exit;
}
Man ska alltid ha med en koll om kopplingen lyckades eller inte, först skrivs felmeddelandet ut och vi skickar med $errno och $errstr därefter kör vi en exit för att avsluta sidan. Om kopplingen skulle misslyckas kommer det att gå 15 sekunder (timeout som är satt ovan) sen skrivs detta felmeddelande ut och sidan avslutas.
Bygg ihop en korrekt header och skicka den
Nu när kopplingen är gjord så måste vi skapa upp en header och skicka den till servern, denna header innehåller datan som vi ska skicka till servern. Först måste vi kontrollera den data som vi ska skicka in.
// * * Kontrollera Queryn
if ($query) {
// * * Lägg till ? om det finns nåt i queryn.
$query = "?". $query;
}
Nu börjar vi bygga ihop headern som ska skickas. Vi använder GET i detta fall, annars kan man skicka in data med POST också. HTTP/1.1 ska självklart användas. User agent skickar vi in bara för att det kan vara bra att följa protokollspecarna någorlunda iaf, sen vad vi skickar in spelar inte så stor roll just nu. Content-Length är för närvarande 0, denna måste man sätta om man skickar in data via bodyn och inte headern. Detta görs på sista raden isåfall, "\n\n$query\n" istället för att skicka in det som en querystring. Content-Type sätter vi så att det ser ut som det är ett formulär som skickar in data.
$header = "".
"GET " . $path ."". $query . "HTTP/1.1\n".
"Host: ". $host ."\n".
"User-Agent: Pellesoft.nu (http://www.pellesoft.nu/)\n".
"Content-Length: 0\n".
"Content-Type: application/x-www-form-urlencoded\n".
"\n\n\n";
Skicka datan
Nu skickar vi datan och den header vi byggde ihop till kopplingen som öppnades ovan med hjälp av funktionen fputs.
fputs ($sock, $header);
Ta emot svaret
Här tar vi emot svaret med funktionen feof, den loopar sålänge kopplingen är öppen och till all data är överfört (timear förståss ut efter 15 sek om det blir något galet). Glöm inte att stänga kopplingen när loopen har kört färdigt.
// * * Loopa strömen av data till slutet
while (!feof($sock)) {
// * * Lägg in datan i $out, hämta 1025 stora chunks åt gången.
$out .= fgets ($sock,1024);
}
// * * Stäng kopplingen
fclose ($sock);
Datan är nu samlad i $out variabeln. Då skriver vi ut den enligt följande.
echo $out;
När man väl har datan kan man förståss göra lite vad man vill med den, kanske leta igenom den efter någon länk, ta ut vissa delar den exempelvis ett email eller nyheter på någon site som inte stödjer RSS etc, finns mycke roligt man kan göra.
0 Kommentarer