@damienalexandre
Conseil, réalisation, audit, expertise et formation
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 !
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érences avec 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érences avec 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
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()
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);
}
}%
/!\ CBLOCK /!\
Sérieusement, c'est dangereux.
Le compilateur pourra pas vous prévenir !
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
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
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
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
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
Le nom déchire ;
PHP vers C++ ;
Documentation en Russe (vk.com).
Il vient de sortir, en développement depuis 2009
Les alternatives
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 benchmark qui 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).
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