Biblioteka cURL to bardzo potężne narzędzie, które można wykorzystać do wykonania praktycznie każdego połaczenia. Aby dobrze ją zrozumieć trzeba wiedzieć co tak naprawdę się dzieje w momencie połączenia, jakie nagłówki są przesyłane, w jaki sposób i jakie dane w wyniku tego są zwracane. Stworzymy sobie zatem do tego na localhoście coś w rodzaju środowiska testowego składającego się z dwóch plików - jednego imitującego serwer, drugiego - imitującego klienta, który się z nim łączy. Do tego celu przygotowałem dwa pliki: server.php, oraz client.php. Oba pliki wrzucimy na localhosta. Omówię je za chwilę, na razie je stwórzmy.
Po stronie serwerowej - server.php
Pierwszy z plików będzie udawał stronę na serwerze.Przeklejmy poniższy kod i zapiszmy plik jako server.php:
[code]<?php
/**
* server.php - PHP Script for testing cURL connections.
* @version 1.1
* @author Marcin Szczygliński <szczyglis83@gmail.com>
* @link http://phpmajster.blogspot.com/search/label/cURL
* @package cURL Tester
*/
session_start();
function showVariables($aVars) {
if (count($aVars) == 0) {
echo " ---";
} else {
foreach ($aVars as $name => $value) {
if(!is_array($value))
{
echo "<p><u>".$name."</u> = ".str_replace(";", "; ", $value)."</p>";
} else {
var_dump($value);
}
}
}
}
// Get referer
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '[NULL]';
?><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>server.php</title><style>
body,td,th { font-family: Consolas, Arial, Verdana, Geneva, sans-serif; font-size: 11px; color: #000; background-color: #fff; }
h1 { background-color: #5f82ba; color: #fff; }
a { color:#5f82ba; text-decoration:none; }
p { margin: 5px; border-bottom:1px dotted #b7b9bb;}
u { text-decoration:none; font-weight:bold; background-color: #5f82ba; padding:1px; color: #fff;
padding-left:4px; padding-right:4px; border: 1px solid #fff; }
table { border-spacing:0px; border: 0px; padding:0; width:100%}
td { padding:10px; border: 1px solid #000;}
.t1 { vertical-align:top; font-weight: bold; font-size: 14px; background-color: #5f82ba; color: #fff;}
</style></head>
<body>
<h1>http://<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ?></h1>
<b>Request from <?php echo $referer; ?>:</b>
<table><tr><td class='t1'>$_GET</td><td><?php showVariables($_GET); ?></td></tr>
<tr><td class='t1'>$_POST</td><td><?php showVariables($_POST); ?></td></tr>
<tr><td class='t1'>$_FILES</td><td><?php showVariables($_FILES); ?></td></tr>
<tr><td class='t1'>$_COOKIE</td><td><?php showVariables($_COOKIE); ?></td></tr>
<tr><td class='t1'>Headers</td><td><?php showVariables(getallheaders()); ?></td></tr>
<tr><td class='t1'>$_SESSION</td><td><?php showVariables($_SESSION); ?></td></tr>
<tr><td class='t1'>$_REQUEST</td><td><?php showVariables($_REQUEST); ?></td></tr>
<tr><td class='t1'>$_SERVER</td><td><?php showVariables($_SERVER); ?></td></tr>
<tr><td class='t1'>$_ENV</td><td><?php showVariables($_ENV); ?></td></tr>
</table>
</body></html>[/code]
Po stronie klienta - client.php
Drugi z plików będzie naszym skryptem do testowania połączeń, udającym aplikację kliencką.Będzie wysyłać requesty do pliku server.php.
Przeklejmy poniższy kod i zapiszmy jako client.php:
[code]<?php
/**
* client.php - PHP Script for testing cURL connections.
* @version 1.1
* @author Marcin Szczygliński <szczyglis83@gmail.com>
* @link http://phpmajster.blogspot.com/search/label/cURL
* @package cURL Tester
*/
// SPECITY URL TO server.php:
$url_to_server = 'http://localhost/server.php';
define('VERSION', '1.1');
session_start();
$errors = '';
$return_headers = [];
function headerLine($curl, $header_line ) {
$GLOBALS['return_headers'][] = $header_line;
return strlen($header_line);
}
function getResponseHeaders()
{
$c = count($GLOBALS['return_headers']);
$str = '';
if($c != 0) {
for($i = 0; $i < $c; $i++)
{
$line = explode(": ", $GLOBALS['return_headers'][$i]);
if(count($line) == 2)
{
$str.= '<p><u>'.$line[0].':</u> '.trim($line[1]).'</p>';
} else {
if(trim($GLOBALS['return_headers'][$i]) != "")
{
$str.= '<p><u>'.$GLOBALS['return_headers'][$i].'</u></p>';
} else {
$str.= '<br />';
}
}
}
}
return $str;
}
if(!empty($_GET['q'])) $url_to_server = urldecode($_GET['q']);
$ch = curl_init($url_to_server);
// ====== CURL OPTIONS ========
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser');
curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine");
//curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 1);
// ====== CURL OPTIONS ========
// Execute cURL and get response
$response_body = curl_exec($ch);
// Get errors
if (curl_errno($ch)) $errors.= '<p class="error">Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</p>';
// Get cURL info into buffer
ob_start();
var_dump(curl_getinfo($ch));
$info = ob_get_clean();
// Close connection
curl_close($ch);
?>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>client.php</title><style>
body,td,th, input { font-family: Consolas, Arial, Verdana, Geneva, sans-serif; font-size: 11px; color: #000; background-color: #fff;}
h3 { text-align: center; }
h1{ background-color: #5f82ba; color: #fff; }
a { color:#5f82ba; text-decoration:none; }
a:hover { color:#000; text-decoration:underline; }
p { margin: 5px; border-bottom:1px dotted #b7b9bb;}
u { text-decoration:none; font-weight:bold; background-color: #5f82ba; padding:1px; color: #fff;
padding-left:4px; padding-right:4px; border: 1px solid #fff; }
.q { width: 400px; }
.errors { background-color: #f5d4d1; }
.error { color: #c96359; font-size:14px}
.clr { clear:both; }
.footer { font-size: 12px; text-align: center; padding:10px;}
.headers { width: 50%; float:right; }
.content { padding:20px; }
.response_client { float:left; margin:0px, padding:0px; width:50%; }
.hide { display:none; }
.f1 { float: left; width:50%; }
.f2 { float: right; width:50%; text-align: left; }
</style></head>
<body><h1>client.php</h1>
<div class="f1">
<h3>RESPONSE FROM <a href="<?php echo $url_to_server; ?>" target="_blank"><?php echo $url_to_server; ?></a>:</h3>
</div>
<div class="f2">
<form method="get" action="/client.php">URL: <input class="q" name="q" value="<?php echo $url_to_server;?>" /><input type="submit" value=">" /></form>
</div><div class="clr" />
<hr />
<div class="response_client"><?php echo $response_body; ?></div>
<div class="headers">
<?php if($errors != '') { ?>
<h1 class="errors">ERRORS</h1><div class="content error"><?php echo $errors; ?></div>
<?php } ?>
<h1>HEADERS</h1><div class="content"><?php echo getResponseHeaders(); ?></div>
<h1>curl_getinfo()</h1><div class="content"><?php echo $info; ?></div>
</div><div class="clr" />
<div class="footer">v. <?php echo VERSION; ?> |
<a href="http://phpmajster.blogspot.com/search/label/cURL" target="_blank">http://phpmajster.blogspot.com/search/label/cURL</a> |
<a href="http://php.net/manual/en/book.curl.php" target="_blank">http://php.net/manual/en/book.curl.php</a></div>
</body></html>[/code]
Krótkie omówienie obu plików:
1) server.phpPlik server.php będzie imitować aplikację/stronę na serwerze z jaką będziemy się łączyć za pomocą pliku client.php. Zawiera on tabelkę, w której listowane są wszystkie zmienne z tablic $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_REQUEST, $_ENV i $_FILES oraz wszystkie nagłówki HTTP. Podczas połączenia z poziomu client.php będziemy pobierać ciało pobieranej strony, czyli server.php razem z tabelką, która pokaże nam jakie wartości uzyskują poszczególne zmienne i jakie nagłówki są przesyłane/odbierane.
Wynik odpalenia pliku server.php na moim lokalnym serwerze:
(kliknij, aby powiększyć)
2) client.php
Drugi plik, czyli client.php jak już napisałem, służyć będzie do testowania cURL-a.
Domyślnie jest on wypełniony kilkoma opcjami, które zostaną omówione w kolejnych artykułach oraz przykładowym połączeniem (w tym przypadku z naszym server.php).
Tutaj ważna uwaga - w zmiennej $url_to_server ustawiamy URL do pliku server.php - pamiętajmy - URL, a nie ścieżkę, gdyż połączenie musi przejść przez serwer, a więc np.
[code]$url_to_server = 'http://localhost/server.php';[/code]
zależnie od tego, gdzie umieściliśmy nasze pliki na serwerze, ja na potrzeby artykułów utworzyłem vhosta.
URL do strony, z którą się łaczymy możemy też podać w parametrze $_GET['q'], nadpisze to tymczasowo URL podany na sztywno w skrypcie, np.:
[code]http://localhost/client.php?q=http://www.onet.pl[/code]
spowoduje połączenie z Onetem poprzez cURL.
Wyświetlane informacje
Skrypt w pliku client.php wyświetla szereg danych, które będą nas interesować, takich jak ustawienia cURL-a, zwrócone nagłówki (headers) oraz ciało odpowiedzi.Wynik odpalenia pliku client.php na moim lokalnym serwerze:
(kliknij, aby powiększyć)
gdzie:
[1] informacje o połączeniu
[2] formularz do szybkiego wprowadzenia adresu z jakim się łączymy
[3] nagłówki zwrócone przez server.php (odpowiedż serwera)
[4] zawartość zwrócona przez server.php (odpowiedż serwera)
Mając tak przygotowane środowisko, zapraszam do następnych artykułów, gdzie nauczymy się korzystać z cURL-a na wybranych przykładach.
Firebug
Nagłówki HTTP - zarówno żądania jak i odpowiedzi można też bardzo wygodnie badać za pomocą dodatku Firebug do Firefoxa. Gorąco polecam to narzędzie, gdyż jest ono niemal już standardem podczas debuggowania stron i aplikacji webowych. Nagłówki znajdziemy w sekcji Network, lub Sieć jeśli posiadamy polską wersję językową:Firebuga pobrać można stąd: https://getfirebug.com/downloads
Oficjalny, pełny manual biblioteki cURL znajduje się tutaj: http://php.net/manual/en/book.curl.php
Brak komentarzy:
Prześlij komentarz
Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)