HHVM et "Hack", prenez 2 versions d'avance sur PHP

PHP Tour Lyon - Benjamin Clay & Mathieu Darse - Juin 2014

HHVM et "Hack", prenez 2 versions d'avance sur PHP

PHP Tour Lyon - Benjamin Clay & Mathieu Darse - Juin 2014

Coucou, je suis Benjamin Clay

@ternel

Coucou, je suis Mathieu Darse

@mdarse

Parlons de ...

JoliBlur

C'est comme Babbitch chez M6Web

Parlons de ...

PHP a de bons côtés

Des points négatifs

Bref...

 == 

 == 
  • Parfait pour un projet rapide, fait le soir dans une chambre d'étudiant.
  • Facebook

  • Faites un site qui permet de glander au bureau... et :
  • Les problèmes commencent...

    Languages don't scale. Architecture does.

    Abraham Lincoln

    Facebook Engineering

    Solution possible :
    Réécrire sous forme d'extension PHP

    HipHop for PHP (aka HPHPc)

    HipHop for PHP (aka HPHPc)

    AST

    HipHop for PHP (aka HPHPc)

    HHVM

    HipHop Virtual Machine

    HipHop Virtual Machine

    Sans Machine Virtuelle (HPHPc)

    Avec Machine Virtuelle (HHVM)

    Just-in-Time (JIT) ?

    Just-in-Time (JIT) ?

    Just-in-Time (JIT) ?

    Benchmarks

    Benchmarks

    HipHop Virtual Machine

    HipHop Virtual Machine

    HHVM

    Compatibilité

    assetic codeigniter composer doctrine2 drupal facebookphpsdk fastroute guzzle hhvmquickinterp idiorm jshrink json_schema laravel lessphp mediawiki mockery monolog mustache paris phpbb3 phpmyadmin phpunit ratchet reactphp slim stash twig

    Compatibilité

    Extensions HHVM

    Installation

    Hack

    Hack ?

    Hack !

    XHP

    Fonctionnalités

    Rappel !

    PHP est dynamiquement typé !

    Type hinting

  • Propriétés
  • Retour d'une fonction/méthode
  • Type nullable: ?type
  • <?hh
    class Poney {
      private int $weight;
    
      public function __construct(int $weight) {
        $this->weight = $weight;
      }
    
      public function addWeight(int $delta)
      : Poney {
        $this->weight += $delta;
    
        return $this;
      }
    
      public function getWeight(): int {
        return $this->weight;
      }
    }
    

    Type hinting

  • Propriétés
  • Retour d'une fonction/méthode
  • Type nullable: ?type
  • <?hh
    class Poney {
      public function __construct(
      	private int $weight
      ) {
      }
    
      public function addWeight(int $delta)
      : Poney {
        $this->weight += $delta;
    
        return $this;
      }
    
      public function getWeight(): int {
        return $this->weight;
      }
    }
    

    Type Checker

  • Daemon type-checker : sur le poste du dev, watch le code source
  • Recalcule méthode par méthode == rapidité !
  • Configuration via .hhconfig
  • $ hh_client pour voir l'état
  • Generics

  • Java/C#
  • T remplacé par un type à l'initialisation
  • Analyse statique du code
  • <?hh
    class List<T> {
      public function __construct(
      	private T $data
      ) {
      }
    
      public function insert(T $data)
      : void {
      	// Stuff
      }
    
      public function count()
      : int {
      	// Stuff
      }
    }
    

    Collections

  • Map : Valeurs de même type, clés = string ou int
  • $map = Map{'pony' => 5, 'unicorn' = 42};
  • Vector : Liste ordonnée de valeurs du même type
  • $vector = Vector{'pony', 'unicorn'};
  • Set : Liste d'int ou string
  • $set = Set{'pony', 'unicorn'};
  • Pair : Paire de valeur de n'importe quel type, immutable
  • $pair = Pair{'jolicode', 42};

    Fonctions anonymes

    Fonctions asynchrones

    • Paralléliser les tâches :
      cuire des pâtes, couper les tomates, ...
    • async et await keywords
    • /!\ Early stage : use at your own risk!
    <?hh
    async function getPage($url) {
      $fp = fopen($url, 'r');
      await $fp;
      return stream_get_contents($fp);
    }
    
    $pages = await [
      getPage('http://www.jolicode.com'),
      getPage('http://www.perdu.com'),
      getPage('http://www.mangercoder.fr')
    ];
    
    

    Non supportés dans Hack

    Variables globales, goto, if ... endif;, break N, ...

  • http://docs.hhvm.com/manual/en/hack.unsupported.php
  • Migration de JoliBlur

    I demand an trial by combat

    Benchmarks

    Benchmarks

    Req/s

    PHP 5.5 PHP 5.5 + opcache HHVM HHVM + Hack
    Concurrence = 1 8 20 23 26
    Concurrence = 100 35 70 78 146

    ༼ つ ◕_◕ ༽つ THE POWER OF HACK ༼ つ ◕_◕ ༽つ

    4000 requêtes - The higher the better ;)

    Faut-il l'utiliser ?

    Mais HACK, c'est surtout...

    ... une motivation énorme pour faire bouger les choses !

    Benjamin et Mathieu
    http://jolicode.com

  • https://jolicode.github.io/2014-hhvm-conf
  • https://joind.in/talk/view/11222
  • <?hh
    function getAnswer(Speaker $speaker, Vector<Question> $questions)
    :?Answer
    {
    	foreach ($questions as $question) {
    		if ($speaker->canAnswer($question)) {
    			return $speaker->giveAnswer($question);
    		} else {
    			// OMG, $speaker->getName(), YOU SUCK!
    			return null;
    		}
    	}
    }