Zephir – Extension PHP pour les noobs



Zephir – Extension PHP pour les noobs

0 2


zephir-conf

Introduction about Zephir in french

On Github jolicode / zephir-conf

Zephir

Extension PHP pour les noobs

Présenté par Damien Alexandre / JoliCode

@damienalexandre

Conseil, réalisation, audit, expertise et formation

…Poney, Guinness et gif animés.

Un cadre avantageux, des missions intéressante et un engagement pour la qualité.

Vos 45 prochaines minutes

  • PHP, Zend et Zephir ;
  • Le langage ;
    • Démonstration ;
    • Optimisations ;
  • Les alternatives ;
  • Conclusion.

PHP is not slow

Plutôt un bon langage interprété.

More is less

  • De plus en plus de fonctionnalités ;
  • De plus en plus rapide :
    • 5.2 à 5.3 = ~20% plus rapide ;
    • 5.3 à 5.4 = 20-40% plus rapide ;
    • 5.5 = OpCache built-in.

PHP est rarement le coupable si votre site est à chier.

Pour la majorité des applications, il est très bien.

Bottleneck plutôt côté IO que purement PHP.

Fatal error

Allowed memory size of X bytes exhausted (tried to allocate Y bytes)...

Gourmand en mémoire

  • Manipulation de binaires (images...) ;
  • Algorithmes complexes ;
  • Cryptographie.
  • ORM...
PHP est très bien mais parfois on a besoin de plus. Un framework bouffe des dizaine de mégooctect de mémoire. Voyons comment PHP marche.

Petit rappel

Un PHP par connection, et donc plein de mémoire bouffée. On scale PHP en ajoutant des serveurs, combien, c'est la question.

Zend Engine

Interprète PHP like a boss since 1999

Le ZE laisse la main à la couche extension lors d'appels à du code d'une extension. L'OPCode laisse alors la place a du C. Quoi qu'on en dise, HHVM n'est pas encore au niveau. ZE FTW. 98% de vos site l'utilisent.

Les extensions

Chargés au lancement de PHP php -m !

amqp apc apcu bcmath bz2 calendar Core ctype curl date dba dom ereg exif fileinfo filter ftp gd gettext hash iconv imagick intl json ldap libxml mbstring memcache memcached mhash mysql mysqli openssl pcntl pcre PDO pdo_mysql pdo_pgsql pdo_sqlite pgsql Phar posix Reflection session shmop SimpleXML soap sockets SPL sqlite3 standard sysvmsg sysvsem sysvshm tokenizer wddx xdebug xml xmlreader xmlwriter Zend OPcache zip zlib...

Pourquoi faire une extension

  • utiliser des interfaces système non accessibles via PHP ;
  • obfusquer du code pour le vendre $$$$ ;
  • devenir une star sur http://pecl.php.net/ ;
  • améliorer les performances !

Benchmark HHVM vs Zephir vs C vs PHP

Pourquoi en Zephir ?

C'est swag, c'est nouveau, c'est facile, et C ça fait peur. Surtout une extension Zephir a plus de chances d'être maintenable par des dev's PHP qu'une en C. On est des développeurs haut niveau, C est trop exigent. Un dev PHP n'est pas moins bon qu'un dev C. C'est juste deux monde différents.

Zephir

  • Ze(nd Engine) Ph(p) I(nt)r(mediate)
  • Mix de PHP et de C...
  • ... écrit en C et en PHP ;
  • Encore en Alpha ;
  • Base de PhalconPHP 2 ;
  • Qui se souvient de HPHPc ?
Pour info, PhalconPHP c'est le framework PHP le plus rapide d'après le benchmark de techempower.com, et il est devant des applis en Node.js / MongoDB. Créé parce que PhalconPHP grossi mais personne contribu, forcement c'est en C.

Le langage Zephir

  • Fichiers .zep ;
  • Fortement typé, ou pas ;
  • Compilateur en PHP ;
  • Apporte de nouvelles instructions ;
  • Fait pour être rapide.
Les optimisations sont "built-in".

Permet

à un développeur haut niveau (PHP) de faire une extension bas niveau (C)

Merci, au revoir.

Les différencesavec PHP

  • pas de <?php ;
  • pas de $ pour les variables ;
  • tout en objet et namespace ;
  • tous les noms de fichiers en lowercase ;
  • pas de pointeur (&) ;
  • il faut pré-déclarer toutes les variables.

Les différencesavec PHP, épisode 2

  • let devant chaque modification ;
  • pas de variable globale ;
  • le type hint avec des crochets :function test(<Coucou\Test> foo)
  • et il faut compiler pour tester.
namespace Test;

class MyTest extends SomeNamespace\MyAnotherClass
{
    public function someFunction(a, b)
    {
        return a + b;
    }
}

Ça sent pareil mais ça n'en est pas.

Toujours intéressé ?

Installation !

Quelques pré-requis

  • php5-dev
  • phpize
  • gcc, make... (ce que vous voulez)
  • json-c

Installation

$ git clone https://github.com/phalcon/zephir
$ cd zephir
$ ./install -c
$ zephir help
 _____              __    _
/__  /  ___  ____  / /_  (_)____
  / /  / _ \/ __ \/ __ \/ / ___/
 / /__/  __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
         /_/

Zephir version 0.3.10a

Live Démo

Effet Bonaldi : Toute démonstration d'un produit quelconque qui fonctionnait parfaitement aux répétitions foirera lamentablement lors de la démonstration publique.

Array

// string keys
let elements = ["foo": "bar", "bar": "foo"];

// numeric keys
let elements = [4: "bar", 8: "foo"];

// mixed string and numeric keys
let elements = [4: "bar", "foo": 8];

Ni comme en PHP, ni comme en JSON.

Elseif

if false {
    echo "false?";
} else {
    if true {
        echo "true!";
    } else {
        echo "neither true nor false";
    }
}

We need to go deeper.

Foreach

let items = ["a": 1, "b": 2, "c": 3, "d": 4];

for key, value in items {
    echo key, " ", value, "\n";
}

Plus proche de Javascript.

Fetch

<?php

if (isset($myArray[$key])) {
    $value = $myArray[$key];
    echo $value;
}
if fetch value, myArray[key] {
    echo value;
}

Getter et setter

namespace App;

class MyClass
{
    protected myProperty {
        set, get, toString
    };

    protected someProperty = 10 {
        set, get
    }
}

config.json

{
    "namespace": "hello",
    "name": "Hello Extension",
    "description": "An extension doing nothing!",
    "author": "Bob l'éponge",
    "version": "0.0.1"
}

PHPInfo

{
    "info": [
        {
            "header": ["Directive", "Value"],
            "rows": [
                ["setting1", "value1"],
                ["setting2", "value2"]
            ]
        }
    ]
}

Aller plus loin

  • Optimizer : remplacer des appels de fonctions ;
  • CBLOCK : injecter du C !

Optimizer

  • Classe PHP dans /optimizers ;
  • Remplace n'importe quelle fonction ;
  • Manipulation des Headers ;
  • Utilisé par Zephir lui-même.

StrlenOptimizer.php

$context->headersManager->add('kernel/string');

$resolvedParams = $call->getReadOnlyResolvedParams(
            $expression['parameters'],
            $context,
            $expression
);

return new CompiledExpression(
            'int',
            'zephir_fast_strlen_ev(' . $resolvedParams[0] . ')',
            $expression
);

zephir_fast_strlen_ev => Z_STRLEN_P()

Fichier complet

Remplace de nombreux appels "PHP userland" par des appels Zend (mais complétés avec types, checks divers...)

WhateverOptimizer.php

  • Phalcon 2 utilise le code C de Phalcon 1 ;
  • Ajoutez vos propres headers et fichiers C ;
  • Si Zephir vous limite, vous avez la main ;
  • Aucune limitation liée au langage.
La minification JS de Phalcon est écrite en pure C.

CBLOCK

  • Injecter du code en pur C ;
  • Dans les headers, avant la classe, dans une méthode...
  • A réserver aux pros (non documenté).

Syntaxe CBLOCK

%{
    #include "kernel/require.h"
}%
%{

    // c implement fibonacci
    static long fibonacci(long n) {
        if (n < 2) return n;
        else return fibonacci(n - 2) + fibonacci(n - 1);
    }
}%

En savoir plus

/!\ CBLOCK /!\

Sérieusement, c'est dangereux.

Le compilateur pourra pas vous prévenir !

Shut up

Take my money

Zephir sux

  • Pas facile de débugguer (pas de stack trace) ;
  • Si ça plante, tu ne sais pas lire le code C ;
  • Private n'a pas le même sens (bug) ;
  • Des bugs, des segfaults, des larmes ;
  • C'est encore en Alpha - patience.
J'ai essayé de porter Event Dispatcher, pas réussi. J'ai ouvert 6 bugs chez eux. Les arrays se comportent pas bien du tout. Sera déclaré stable quand Phalcon 2 sera fini (Alpha sortie en janvier).

D'autres solutions

Nous vivons une époque formidable.

Les alternatives

HHVM

  • Remplacement de Zend Engine ;
  • Nouvelle syntaxe typée Hack ;
  • Supporte 96% de ZF2 et 97% de Symfony2 (src).
Attention avec HACK, ne sera executable que dans cet env. Quid de l'avenir de HHVM / Facebook? Besoin d'un support fort.

Les alternatives

PHP-QB

  • Sous forme d'extension ;
  • Spécialisé dans les traitements binaires (rendus 2D) ;
  • Exécute lui-même les méthodes tagguées @engine qb.
Un seul contributeur : Chung Leong, depuis mars 2013. DocBlock @var sont lu, types fortement les propriétés et paramètres Ajoute aussi "forl" pour le multithread! Différe via le typage et les String et Array bien moins puissant.

Les alternatives

PH7

  • Permet d'executer du PHP depuis C ;
  • Non en fait non ;
  • Oubliez-le celui-là.
Pour faire du Embed mais en PHP. Créé pour une interface de routeur à la base.

Les alternatives

Phalanger

  • Runtime et compilateur PHP pour .NET ;
  • Faites tourner du PHP sur le serveur ASP.NET de l'école !
  • Visual Studio !
2011. Toujours actif. Promet de meilleures performances aussi. Fait tourner Wordpress.

Les alternatives

KittenPHP

  • Le nom déchire ;
  • PHP vers C++ ;
  • Documentation en Russe (vk.com).
Il vient de sortir, en développement depuis 2009

Les alternatives

PHP CPP

  • Librairie C++ pour développeur PHP ;
  • S'occupe de toute la gestion du Zend Engine ;
  • Création d'extension facilitée.
Si C ne vous fait pas peur, mais que ZendEngine rebute, PHP CPP est l'interface. LEAN PUB par PASCAL MARTIN: 418 pages d'API Zend.

Performances

Attention il y a un benchmarkqui arrive.

A prendre avec des pincettes.

Rendu 2D

Bench de Simon Holywell, faire de l'art fractal avec un ensemble Mandelbrot.

HHVM vs Zephir vs PHP

HHVM vs Zephir vs PHP

HHVM est pas fait pour cela.

PhalconPHP 1 & 2

  • Phalcon 1 en pure C : 2107 req/s ;
  • Phalcon 2 en Zephir : 2120 req/s.

Zephir n'introduit pas (trop) de lenteur (pour l'instant).

Source

Chacune a ses avantages

Vous avez besoin de vitesse :

  • Pure ? Extension C
  • Sans avoir un développeur C ? Zephir
  • Sans changer votre code ? HHVM
  • Sans rien toucher ? Mastercard ©

Une question de balance

  • Deadline ? Compétances ?
  • Confiance dans le code généré ?
  • Équipes solides ?
  • Est-ce vraiment utile ? PHP est-il vraiment le goulot ?

Pour conclure

PHP is a language that optimizes for speed of development, not speed of execution. Jonathan Klein (Etsy)

Zephir fait les deux.

Devez-vous l'utiliser ?

¯\_(ツ)_/¯

Conclusion

Zephir est un outil pour créer des extensions maintenables par des développeurs PHP.

Vous coderez moins vite qu'en PHP mais plus vite qu'en C.

Interdiction de refaire applications entière avec. Attention je vous surveille.

A vous de jouer

Merci \o/

@damienalexandre

Photos, sources et ressources