Communications réseaux      HTTP avec PHP
Bonjour à tous●   Julien PAULI    –   Utilisateur PHP depuis ~10ans    –   Linux / Unix adopter    –   PHP Internals revie...
BlaBlacar●   http://www.blablacar.com●   http://www.covoiturage.fr    –   2.5 Millions de membres    –   400.000 personnes...
BlaBlaCar tech●   PHP 5.3, MySQL 5.5 (percona),    Lighttpd+FastCGI●   Debian●   8 front web servers (4 virtual)●   1 MySQ...
GoLets Go
Au menu aujourdhui●   Rappels généraux sur le réseau    –   Protocoles et encapsulation●   Communiquer sur le réseau avec ...
Rappels sur le réseau●   Web = modèle TCP/IP (4 couches)●   PHP permet de jouer avec les couches 3    et 4
Analyser le trafic réseau●   TcpDump ou graphiquement : Wireshark●   Mise en pratique de lencapsulation    protocolaire●  ...
Le réseau sous Unix / Linux●   Au moins sur un point, tout le monde Unix    sest mis daccord    –   Grâce à BSD :)●   ! SO...
Le réseau sous Unix / Linux
PHP et le réseau●   PHP utilise lAPI sockets de lOS    –   Via une couche intermédiaire (streams)    –   main/network.c et...
Communiquer avec PHP  Fonctionnalité     Couche réseau   Client   Serveur   Disponibilité   fsockopen()         Transport ...
La base du réseau en PHP●   Sans sembêter, on utilise les flux (streams)
fsockopen() fsockopen()
fsockopen() : transport●   fsockopen() joue en couche transport     –   Vous devez donc écrire le protocole applicatif    ...
Couche Transport●   TCP par défaut     –   Equivalents :    $fp = fsockopen(‘www.php.net’, 80);    $fp = fsockopen(‘tcp://...
fsockopen() , quelques limites●   fsockopen() a quelques limites    –   Client seulement    –   Peu doptions (pas de strea...
stream_socket_**()●    API cliente et serveur●    Couche transport toujours●    Client    $fp = stream_socket_client(‘www....
stream_socket_***() : options●   Quelques options interessantes :    –   stream_set_blocking()        ●   Règle lAPI bloqu...
BSD Sockets  ext/sockets
BSD sockets●   Extension à installer : sockets    –   --enable-sockets●   API équivalente à BSD sockets    –   http://www....
ext/sockets$address = 192.168.1.53;$port = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {  ...
Couche applicative●   Couche au dessus du transport●   Protocole applicatif déjà implémenté●   Exemples :    –   Réseaux  ...
Stream Wrapper●   Pour passer de la couche transport à la    couche application, PHP utilise un stream    wrapper    $fp T...
fopen() and friends●   fopen() et ses amies agissent en couche    applicative●   Elles utilisent le wrapper que vous    pr...
Créer sa propre couche●    Vous pouvez créer votre propre couche     applicative et utiliser votre propre wrapper    strea...
Agir sur une couche    ●   PHP propose de modifier à la volée ses        wrappers intégrés        –   Exemple : proxy get ...
HTTPHTTP with PHP
PHP et HTTP●   Plusieurs moyens de parler HTTP    –   Utiliser le wrapper PHP intégré (http://)    –   Ecrire soi-même la ...
Wrapper intégré    ●   Tout ce qui est http:// sur les fonctions PHP$context = stream_context_create(   array(http =>array...
Ecrire son wrapper●   Reinvent the wheel ?           $fp = fsockopen(myserver.net, 80);           $http = <<<HTTP         ...
Curl●   http://curl.haxx.se/●   Pour PHP : --with-curl ou extension PECLcurl is a command line tool for transferring data ...
Curl example$soap_request = "<?xml version="1.0"?>n";$soap_request .= "<soap:Envelope xmlns:soap=" blablabla"$header = arr...
ext/HTTP●   Sans doute le moyen le plus puissant et le    plus efficace de parler HTTP avec PHP●   Extension    –   pecl i...
ext/HTTP API●   Classes :    –   HTTPRequest    –   HTTPResponse    –   HTTPQueryStream    –   HTTPMessage●   Gestion de l...
ext/HTTP examples    $http_req = new HttpRequest("http://www.example.com");    $http_req->setOptions(array(timeout=>10,use...
Thank you for listening !
Upcoming SlideShare
Loading in …5
×

Communications Réseaux et HTTP avec PHP

3,558 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,558
On SlideShare
0
From Embeds
0
Number of Embeds
44
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Communications Réseaux et HTTP avec PHP

  1. 1. Communications réseaux HTTP avec PHP
  2. 2. Bonjour à tous● Julien PAULI – Utilisateur PHP depuis ~10ans – Linux / Unix adopter – PHP Internals reviewer depuis ~3y ● I love C coding – PHP 5.5 Release Manager – Travaille pour blablacar Paris – Ecrit des articles tech PHP et des livres – @julienpauli - github.com/jpauli - jpauli@php.net
  3. 3. BlaBlacar● http://www.blablacar.com● http://www.covoiturage.fr – 2.5 Millions de membres – 400.000 personnes font du covoiturage chaque mois en France – 100% croissance depuis 4 ans ● Nous recrutons ! Passez me voir :) – European open : UK, Netherlands, Portugal, Poland, Italy, Spain – Apps mobiles Android & Iphone
  4. 4. BlaBlaCar tech● PHP 5.3, MySQL 5.5 (percona), Lighttpd+FastCGI● Debian● 8 front web servers (4 virtual)● 1 MySQL master, 2 slaves● 200Gb MySQL data● Redis, ElasticSearch, Symfony2, RabbitMQ, OpscodeChef ...
  5. 5. GoLets Go
  6. 6. Au menu aujourdhui● Rappels généraux sur le réseau – Protocoles et encapsulation● Communiquer sur le réseau avec PHP – Différentes API offertes● HTTP avec PHP – Différentes API offertes
  7. 7. Rappels sur le réseau● Web = modèle TCP/IP (4 couches)● PHP permet de jouer avec les couches 3 et 4
  8. 8. Analyser le trafic réseau● TcpDump ou graphiquement : Wireshark● Mise en pratique de lencapsulation protocolaire● Superbe outils de piratage débogage de réseau
  9. 9. Le réseau sous Unix / Linux● Au moins sur un point, tout le monde Unix sest mis daccord – Grâce à BSD :)● ! SOCKETS ! – POSIX
  10. 10. Le réseau sous Unix / Linux
  11. 11. PHP et le réseau● PHP utilise lAPI sockets de lOS – Via une couche intermédiaire (streams) – main/network.c et main/streams● PHP fournit plusieurs API réseau à lutilisateur – Client ou serveur – Une des API est calquée sur POSIX Sockets
  12. 12. Communiquer avec PHP Fonctionnalité Couche réseau Client Serveur Disponibilité fsockopen() Transport Oui Non Nativestream_socket_**() Transport Oui Oui Native socket_**() Transport Oui Oui ext/sockets curl_**() App Oui Non ext/curl fopen() & friends App Oui Non Native
  13. 13. La base du réseau en PHP● Sans sembêter, on utilise les flux (streams)
  14. 14. fsockopen() fsockopen()
  15. 15. fsockopen() : transport● fsockopen() joue en couche transport – Vous devez donc écrire le protocole applicatif – Ici : HTTP $fp = fsockopen(‘www.php.net’, 80); fwrite($fp, “GET / HTTP/1.0rn” . “Host: www.php.netrnrn”); $data = fread($fp, 8192);● Liste des transports disponibles : stream_get_transports() – souvent, TCP est utilisé
  16. 16. Couche Transport● TCP par défaut – Equivalents : $fp = fsockopen(‘www.php.net’, 80); $fp = fsockopen(‘tcp://www.php.net’, 80);● Faux (protocole applicatif spécifié): $fp = fsockopen(‘http://www.php.net’, 80);● UDP someone ? $fp = fsockopen(‘udp://10.11.10.11:112);● Unix socket someone ? $fp = fsockopen(‘unix:///var/run/mysqld/mysqld.sock);
  17. 17. fsockopen() , quelques limites● fsockopen() a quelques limites – Client seulement – Peu doptions (pas de stream context)● Please, welcome stream_socket_**() – stream_socket_client() – stream_socket_server()
  18. 18. stream_socket_**()● API cliente et serveur● Couche transport toujours● Client $fp = stream_socket_client(‘www.php.net:80); fwrite($fp, "GET / HTTP/1.0rnHost: www.php.netrnrn"); $data = fread($fp, 8192);● Serveur $fp = stream_socket_server(‘tcp://0.0.0.0:1234); /* un doux combiné socket()-bind()-listen() */
  19. 19. stream_socket_***() : options● Quelques options interessantes : – stream_set_blocking() ● Règle lAPI bloquante / non-bloquante – stream_notification_callback() ● Appel une callback lorsque {xxxx} sur le flux – stream_set_write/read_buffer() ● Taille des buffers – stream_copy_to_stream() ● Genre de pipe – stream_select() ● syscall select() / poll()
  20. 20. BSD Sockets ext/sockets
  21. 21. BSD sockets● Extension à installer : sockets – --enable-sockets● API équivalente à BSD sockets – http://www.freebsd.org/doc/en/books/develope rs-handbook/sockets.html
  22. 22. ext/sockets$address = 192.168.1.53;$port = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error());}if (socket_bind($sock, $address, $port) === false) { echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock));}if (socket_listen($sock, 5) === false) { echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock));}do { if (($msgsock = socket_accept($sock)) === false) { echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock))"n"; break; } /* Send instructions. */ $msg = "nWelcome to the PHP Test Server. n" . "To quit, type quit. To shut down the server type shutdown.n"; socket_write($msgsock, $msg, strlen($msg));
  23. 23. Couche applicative● Couche au dessus du transport● Protocole applicatif déjà implémenté● Exemples : – Réseaux ● http ● ftp ● ssh – Locaux ● php ● data ● zip
  24. 24. Stream Wrapper● Pour passer de la couche transport à la couche application, PHP utilise un stream wrapper $fp Transport : – = fsockopen(‘www.php.net’, 80); fwrite($fp, “GET / HTTP/1.0rn” . “Host: www.php.netrnrn”); $data = fread($fp, 8192); $fp Application (wrapper http://) : – = fopen(‘http://www.php.net’, ‘r’); $data = fread($fp, 8192);
  25. 25. fopen() and friends● fopen() et ses amies agissent en couche applicative● Elles utilisent le wrapper que vous précisez : $fp = fopen(‘http://www.php.net’, ‘r’); $data = fread($fp, 8192); $data = file_get_contents(‘ftp://foo:bar@myhost.net/file.txt’); readfile(‘phar://my-php.phar/lib/myclass.php’); echo "foo" | php -r readfile(‘php://fd/0’);
  26. 26. Créer sa propre couche● Vous pouvez créer votre propre couche applicative et utiliser votre propre wrapper stream_wrapper_register(mysql, MySQLWrapperClass); $fp = fopen(mysql://admin:secret@server/mydb/mytable); while (!feof($fp)) { echo fread($fp); }● Exemples : – http://www.hoa-project.net – https://github.com/mikey179/vfsStream
  27. 27. Agir sur une couche ● PHP propose de modifier à la volée ses wrappers intégrés – Exemple : proxy get to post$context = stream_context_create( array(http =>array(method=>POST, header=>Content-Type: application/x-www-form-urlencoded, content=>http_build_query($_GET))) );echo file_get_contents("http://inject-post-data-server",null,$context);
  28. 28. HTTPHTTP with PHP
  29. 29. PHP et HTTP● Plusieurs moyens de parler HTTP – Utiliser le wrapper PHP intégré (http://) – Ecrire soi-même la couche over transport – Utiliser Curl – Utiliser ext/HTTP
  30. 30. Wrapper intégré ● Tout ce qui est http:// sur les fonctions PHP$context = stream_context_create( array(http =>array(method=>POST, header=>Content-Type: application/x-www-form-urlencoded, content=>http_build_query($_GET))) );echo file_get_contents("http://inject-post-data-server",null,$context); ● Quelques fonctions PHP – http_build_query() – header() - get_headers() - get_meta_tags() ● Suffisant, mais pas très poussé
  31. 31. Ecrire son wrapper● Reinvent the wheel ? $fp = fsockopen(myserver.net, 80); $http = <<<HTTP GET /foo HTTP/1.1rn Host: myserver.netrn Accept: text/htmlrn HTTP; fwrite($fp, $http); echo fgets($fp);
  32. 32. Curl● http://curl.haxx.se/● Pour PHP : --with-curl ou extension PECLcurl is a command line tool for transferring data with URL syntax, supportingDICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP.curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading,HTTP form based upload, proxies, cookies, user+password authentication(Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume,proxy tunneling and a busload of other useful tricks.● On fait des choses très puissantes avec Curl – Pas seulement sur HTTP
  33. 33. Curl example$soap_request = "<?xml version="1.0"?>n";$soap_request .= "<soap:Envelope xmlns:soap=" blablabla"$header = array( "Content-type: text/xml;charset="utf-8"", "Accept: text/xml", "Cache-Control: no-cache", "SOAPAction: "foo"", "Content-length: ".strlen($soap_request),);$soap_do = curl_init();curl_setopt($soap_do, CURLOPT_URL, "http://myserver/soap-server" );curl_setopt($soap_do, CURLOPT_TIMEOUT, 10);curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );curl_setopt($soap_do, CURLOPT_POST, true );curl_setopt($soap_do, CURLOPT_POSTFIELDS, $soap_request);curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header);if(curl_exec($soap_do) === false) { $err = Curl error: . curl_error($soap_do); echo $err;} else { echo "yeah"; }curl_close($soap_do);
  34. 34. ext/HTTP● Sans doute le moyen le plus puissant et le plus efficace de parler HTTP avec PHP● Extension – pecl install pecl_http – Ou compiler dans la source● Interface riche pour piloter HTTP, orientée objet
  35. 35. ext/HTTP API● Classes : – HTTPRequest – HTTPResponse – HTTPQueryStream – HTTPMessage● Gestion de la compression gzip● Gestion du cache● Fonctions de liaison avec le buffer de sortie PHP
  36. 36. ext/HTTP examples $http_req = new HttpRequest("http://www.example.com"); $http_req->setOptions(array(timeout=>10,useragent=>"MyScript")); $http_req->send(); echo $http_req->getResponseBody(); $http_req = new HttpRequest("http://www.example.com"); $http_req->setOptions(array(timeout=>10,useragent=>"MyScript")) try { $http_req->send(); } catch (HttpException $ex) { echo $ex->getMessage(); }● Quelques fonctions auto-parlantes au hasard : – http_redirect(), http_send_data(), http_send_file(), http_send_stream(), http_put_data(), http_parse_cookie()...
  37. 37. Thank you for listening !

×