50
Сладкое будущее: Phalcon и Zephir / Dmitry Patsura @ovr

Сладкое будущее: Phalcon и Zephir

Embed Size (px)

Citation preview

Page 1: Сладкое будущее: Phalcon и Zephir

Сладкое будущее:Phalcon и Zephir

/ Dmitry Patsura @ovr

Page 2: Сладкое будущее: Phalcon и Zephir

В ближайшие 30 минутФреймворки на Си для PHPPhalcon 1ZephirZephir RuntimePhalcon 2

Page 3: Сладкое будущее: Phalcon и Zephir

Фреймворки на Си для PHPУже не новость, а сложившийся тренд.

Page 4: Сладкое будущее: Phalcon и Zephir

Yaf (yet another framework)Yaf — это первый PHP микро-фреймворк, взявший за основу

структуру приложения Zend Framework, но написанный на С иявляется PHP extension доступным через PECL.

Page 5: Сладкое будущее: Phalcon и Zephir

PhalconPhalcon - это веб-фреймворк с высокой производительностью и

низким потреблением ресурсов, собранный в виде Си-расширения для PHP.

Page 6: Сладкое будущее: Phalcon и Zephir

ПлюсыПроизводительность (~6 раз быстрее Zend 2)Низкое потребление памяти (0.75 Мб)Простота использования (в коде)Наличие готовых решенийБольшая универсальность

Page 7: Сладкое будущее: Phalcon и Zephir

МинусыРазработка и исправлениеОтладка (GDB, Valgrind)

Page 8: Сладкое будущее: Phalcon и Zephir

А что за железяка?Intel® Xeon® E3-1270 v3 Quad-Core Haswell 4 core / 8

hyper threadsRAM 32GB

2 x 240 GB SATA RAID 1 SSD

Page 9: Сладкое будущее: Phalcon и Zephir

А теперь еще софтGNU/Linux 3.13 Ubuntu x86_64PHP 5.6.6 FPM SAPI + OPCache

Nginx 1.6.2

Тестируем через Apache benchmark (ab)

Page 10: Сладкое будущее: Phalcon и Zephir

Производительность MVC (RPS)3 054

527823 794

Phalcon 1 ZF 2.3.7 Yii 2.0.3 Symfony 2.6.30

250

500

750

1000

1250

1500

1750

2000

2250

2500

2750

3000

3250

Page 11: Сладкое будущее: Phalcon и Zephir

Производительность Micro (RPS)

6 863

2 491

4 127

Phalcon 1 Micro Silex 1.2.3 Slim 2.6.20

50010001500200025003000350040004500500055006000650070007500

Page 12: Сладкое будущее: Phalcon и Zephir

Что внутри?Си-кодРабота с Zend EngineПарсер для аннотаций и PQL (Phalcon Query Language)

Page 13: Сладкое будущее: Phalcon и Zephir

PHP_METHOD(Phalcon_Mvc_Application, registerModules){

zval *modules, *merge = NULL, *registered_modules, *merged_modules = NULL;

PHALCON_MM_GROW();

if (PHALCON_IS_FALSE(merge)) { phalcon_update_property_this(this_ptr, SL("_modules"), modules TSRMLS_CC); } else { PHALCON_OBS_VAR(registered_modules); phalcon_read_property_this(&registered_modules, this_ptr, SL("_modules"), PH_NOISY TSRMLS_CC);

if (Z_TYPE_P(registered_modules) == IS_ARRAY) { PHALCON_INIT_VAR(merged_modules); phalcon_fast_array_merge(merged_modules, &registered_modules, &modules TSRMLS_CC); } else { PHALCON_CPY_WRT(merged_modules, modules); }

phalcon_update_property_this(this_ptr, SL("_modules"), merged_modules TSRMLS_CC); }

RETURN_THIS();}

Page 14: Сладкое будущее: Phalcon и Zephir

Как же исправить ситуацию?

Си для PHP разработчика - это сложно

Page 15: Сладкое будущее: Phalcon и Zephir

Это DSLJava

ScalaGroovyClojure

JavascriptCoffeeScriptLiveScriptTypeScript

Page 16: Сладкое будущее: Phalcon и Zephir

А что же для Zend Engine?

Page 17: Сладкое будущее: Phalcon и Zephir

ZephirZe(nd Engine) Ph(p) I(nt)r(mediate)

Zephir — это высокоуровневый язык программирования соткрытым исходным кодом для быстрого и простого создания

PHP расширений.

Page 18: Сладкое будущее: Phalcon и Zephir

Как изнутри?

Page 19: Сладкое будущее: Phalcon и Zephir

Самые видимые различия после PHPПеременная должна быть объявлена перед использованиемСтатическая\Динамическая типизацияПишем все в пространстве именГлобальный код запрещенКомпиляция Ahead-of-time (AOT)Ура больше нет <?php и $Безопасная работа с памятью (Memory safety)

Page 20: Сладкое будущее: Phalcon и Zephir

Статическая\Динамическая типизация// Динамическая Примитив\Zval\HashTablevar a = 1;

// Массивvar b = [1, 2, 3];array b = [1, 2, 3];

// Статическиеint a = -1;uint a = 1;float pi = 3.14;bool a = true;string a = "Test string";char a = 'A';

Page 21: Сладкое будущее: Phalcon и Zephir

Установка значенийосуществляется через оператор let

let expr = expr или scalar value;

let a = [1, 2, 3, 4, 5];

let b = true;

let c = new Object();

Page 22: Сладкое будущее: Phalcon и Zephir

Установка возвращаемого типаnamespace Test;

class Test { public function testReturnInt() -> int { return 1; }

public function testReturnArray() -> array { return [1, 2, 3, 4, 5]; }

/** * Но устанавливать возвращаемый тип не обязательно */ public function testWithoutReturn() {

}}

Page 23: Сладкое будущее: Phalcon и Zephir

Нативные getter/setterclass Test { protected $request;

public function setRequest($request) { $this->request = $request; }

public function getRequest() { return $this->request; }}

Zephir

class Test { protected request {get, set};}

Page 24: Сладкое будущее: Phalcon и Zephir

Диапазоны значений (Range)Было в PHP

<?php

foreach (range(0, 100) as $number) { echo $number;}

Стало в Zephir

for n in [1..100] {

}

Page 25: Сладкое будущее: Phalcon и Zephir

Использование диапазонов в fornamespace Test;

function iterateVarRange(){ var a;

for a in [1..100] { echo a; // Компилятор будет решать, что использовать для типа }}

function iterateIntRange(){ int i;

for i in [1..100] { echo i; }}

Page 26: Сладкое будущее: Phalcon и Zephir

Встроенные методы для всех типов(Built-in methods)

ArrayCharDoubleIntString

Page 27: Сладкое будущее: Phalcon и Zephir

Built-in for intint a = -36;

a->abs(); // 36a->tobinary(); // 1111111111111111111111111111111111111111111111111111111111011100a->tohex(); // ffffffffffffffdca->tooctal(); // 1777777777777777777734a->pow(2); // 1296

Page 28: Сладкое будущее: Phalcon и Zephir

Built-in for array[4, 8, 12, 32, 5]->map( function(int x) { return x * x; })

Page 29: Сладкое будущее: Phalcon и Zephir

Closures short syntax[4, 8, 12, 32, 5]->map(x => x * x);

Page 30: Сладкое будущее: Phalcon и Zephir

Анонимные переменныеnamespace Test;

function anonymouseKeyFor(array data){ for _ in data { echo "hello"; }}

function anonymouseValueWalk(array data){ data->walk( function(_, int key) { echo key; } );}

Page 31: Сладкое будущее: Phalcon и Zephir

Статический анализnamespace Test;

function testUnusedVal(){ var v; array data = [1, 2, 3, 4, 5, 6, 7];

for v in data { echo "hello"; }}

Но получим Warning

Warning: Variable "v" assigned but not used in Test::testUnusedVal in/Users/ovr/projects/zephir/functional.zep on 5 [unused-variable]

for v in data {----------------̂

Page 32: Сладкое будущее: Phalcon и Zephir

Забыл про анонимные переменные?namespace Test;

function testUnusedVal(){ array data = [1, 2, 3, 4, 5, 6, 7];

for _ in data { echo "hello"; }}

Page 33: Сладкое будущее: Phalcon и Zephir

ОптимизацииFuntionCall - OptimizersRuntime function's call cacheSkipVariantInitConstant folding

Page 34: Сладкое будущее: Phalcon и Zephir

Вызов функции в PHP - не тортМедленно

Много кодаРабота со стекомПарсинг параметровНет нормальной декларации функции в Си коде

Page 35: Сладкое будущее: Phalcon и Zephir

namespace Test\Math;

function calculateMath() { int i;

// 200 000 for i in range(1, 200000) { abs(i); acos(i); asin(i); atan(i); floor(i); exp(i); }}

Zephir time: 0.08000PHP: 10.0

Page 36: Сладкое будущее: Phalcon и Zephir

SkipVariantInit (if-else-statement)class Test { public fn test() { if {expr} { var a = 1; } else { var a = 1; } }}

Page 37: Сладкое будущее: Phalcon и Zephir

SkipVariantGet (еще в работе)class Test { property prop1 = 1;

public fn test() { var a, b, c, d;

let a = this->prop1, b = this->prop1, c = this->prop1, d = this->prop1;

//.... }}

Page 38: Сладкое будущее: Phalcon и Zephir

Constant foldingРаскрытие статических мест

class Test { const TEST1 = 1;

public fn getTEST1() { return self::TEST1; //Константу можно подставить во время компиляции }

public fn getCLASS() { return __CLASS__; //Знаем }

public fn getPHPVersion() { return PHP_VERSION; //Возьмем runtime }}

Page 39: Сладкое будущее: Phalcon и Zephir

Дополнительные возможностиГенерация автокомплита для IDE (IDE stubs)Генерация документации (аналогично PHPDocumentor)

Page 40: Сладкое будущее: Phalcon и Zephir

И другие возможности ;)

Page 41: Сладкое будущее: Phalcon и Zephir

МинусыЕще не реализованы TraitНе хватает оптимизацийВерсия 0.6.1 Alpha (Уже практически Beta)

Page 42: Сладкое будущее: Phalcon и Zephir

Zephir RuntimeZephir Runtime - это JIT компилятор встроенный в расширение.

Page 43: Сладкое будущее: Phalcon и Zephir

func.zep

fn myFunction(var a) { return 1;}

index.php

include_once 'func.zep';

$result = myFunction(1);var_dump($result);

Page 44: Сладкое будущее: Phalcon и Zephir

Будущее ZephirПоддержка PHP 7 (Zend Engine 3)Больше оптимизацийПереработка архитектуры на раздельные компонентыБольше бекендов (PHP, Hack, PHP-CPP)Развитие Zephir RuntimeХотим реализовать ZephirVM*

Page 45: Сладкое будущее: Phalcon и Zephir

Phalcon 2Переписан на Zephir99.99% Совместимый фреймворкУлучшенная кодовая базаУлучшены тесты

Page 46: Сладкое будущее: Phalcon и Zephir

Как установить налокале?

sudo apt-get install php5-dev php5-mysql gcc make re2c libpcre3-dev

git clone -b 2.0.0 https://github.com/phalcon/cphalcon.gitcd extsudo ./install

Page 47: Сладкое будущее: Phalcon и Zephir

Ну а вообщеAnsible, Chef или Puppet

Page 48: Сладкое будущее: Phalcon и Zephir

Как разрабатывать?Берем виртуалку на Vagrant +

VirtualBox *LXC (Linux Kernel Containers) ****Parallels под OSX ***VMWare (Плагин платный) ***

Page 49: Сладкое будущее: Phalcon и Zephir

Сообщество Phalcon и ZephirСайтФорумыГруппы для Phalcon и Zephir в ВКонтактеЧатик на ГиттерБлогиТвиттер

Page 50: Сладкое будущее: Phalcon и Zephir

Спасибо за внимание :3

http://dmtry.me/codefest2015