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:
- <?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>
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:
- <?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>
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.
- $url_to_server = 'http://localhost/server.php';
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.:
- http://localhost/client.php?q=http://www.onet.pl
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! :)