środa, 20 maja 2015

[PHP][cURL] Podstawy cz.1 - przygotujmy sobie środowisko testowe

TRUE
8689737018389349288
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="&gt;" /></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.php
Plik 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! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji