Сладкое будущее: phalcon и zephir
TRANSCRIPT
![Page 2: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/2.jpg)
В ближайшие 30 минутФреймворки на Си для PHPPhalcon 1ZephirZephir RuntimePhalcon 2
![Page 3: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/3.jpg)
Фреймворки на Си для PHPУже не новость, а сложившийся тренд.
![Page 4: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/4.jpg)
Yaf (yet another framework)Yaf — это первый PHP микро-фреймворк, взявший за основу
структуру приложения Zend Framework, но написанный на С иявляется PHP extension доступным через PECL.
![Page 5: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/5.jpg)
PhalconPhalcon - это веб-фреймворк с высокой производительностью и
низким потреблением ресурсов, собранный в виде Си-расширения для PHP.
![Page 6: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/6.jpg)
ПлюсыПроизводительность (~6 раз быстрее Zend 2)Низкое потребление памяти (0.75 Мб)Простота использования (в коде)Наличие готовых решенийБольшая универсальность
![Page 7: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/7.jpg)
МинусыРазработка и исправлениеОтладка (GDB, Valgrind)
![Page 8: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/8.jpg)
А что за железяка?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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/9.jpg)
А теперь еще софтGNU/Linux 3.13 Ubuntu x86_64PHP 5.6.6 FPM SAPI + OPCache
Nginx 1.6.2
Тестируем через Apache benchmark (ab)
![Page 10: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/10.jpg)
Производительность 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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/11.jpg)
Производительность Micro (RPS)
6 863
2 491
4 127
Phalcon 1 Micro Silex 1.2.3 Slim 2.6.20
50010001500200025003000350040004500500055006000650070007500
![Page 12: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/12.jpg)
Что внутри?Си-кодРабота с Zend EngineПарсер для аннотаций и PQL (Phalcon Query Language)
![Page 13: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/13.jpg)
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(®istered_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, ®istered_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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/14.jpg)
Как же исправить ситуацию?
Си для PHP разработчика - это сложно
![Page 15: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/15.jpg)
Это DSLJava
ScalaGroovyClojure
JavascriptCoffeeScriptLiveScriptTypeScript
![Page 16: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/16.jpg)
А что же для Zend Engine?
![Page 17: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/17.jpg)
ZephirZe(nd Engine) Ph(p) I(nt)r(mediate)
Zephir — это высокоуровневый язык программирования соткрытым исходным кодом для быстрого и простого создания
PHP расширений.
![Page 18: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/18.jpg)
Как изнутри?
![Page 19: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/19.jpg)
Самые видимые различия после PHPПеременная должна быть объявлена перед использованиемСтатическая\Динамическая типизацияПишем все в пространстве именГлобальный код запрещенКомпиляция Ahead-of-time (AOT)Ура больше нет <?php и $Безопасная работа с памятью (Memory safety)
![Page 20: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/20.jpg)
Статическая\Динамическая типизация// Динамическая Примитив\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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/21.jpg)
Установка значенийосуществляется через оператор let
let expr = expr или scalar value;
let a = [1, 2, 3, 4, 5];
let b = true;
let c = new Object();
![Page 22: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/22.jpg)
Установка возвращаемого типа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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/23.jpg)
Нативные 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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/24.jpg)
Диапазоны значений (Range)Было в PHP
<?php
foreach (range(0, 100) as $number) { echo $number;}
Стало в Zephir
for n in [1..100] {
}
![Page 25: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/25.jpg)
Использование диапазонов в 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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/26.jpg)
Встроенные методы для всех типов(Built-in methods)
ArrayCharDoubleIntString
![Page 27: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/27.jpg)
Built-in for intint a = -36;
a->abs(); // 36a->tobinary(); // 1111111111111111111111111111111111111111111111111111111111011100a->tohex(); // ffffffffffffffdca->tooctal(); // 1777777777777777777734a->pow(2); // 1296
![Page 28: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/28.jpg)
Built-in for array[4, 8, 12, 32, 5]->map( function(int x) { return x * x; })
![Page 29: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/29.jpg)
Closures short syntax[4, 8, 12, 32, 5]->map(x => x * x);
![Page 30: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/30.jpg)
Анонимные переменные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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/31.jpg)
Статический анализ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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/32.jpg)
Забыл про анонимные переменные?namespace Test;
function testUnusedVal(){ array data = [1, 2, 3, 4, 5, 6, 7];
for _ in data { echo "hello"; }}
![Page 33: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/33.jpg)
ОптимизацииFuntionCall - OptimizersRuntime function's call cacheSkipVariantInitConstant folding
![Page 34: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/34.jpg)
Вызов функции в PHP - не тортМедленно
Много кодаРабота со стекомПарсинг параметровНет нормальной декларации функции в Си коде
![Page 35: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/36.jpg)
SkipVariantInit (if-else-statement)class Test { public fn test() { if {expr} { var a = 1; } else { var a = 1; } }}
![Page 37: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/39.jpg)
Дополнительные возможностиГенерация автокомплита для IDE (IDE stubs)Генерация документации (аналогично PHPDocumentor)
![Page 40: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/40.jpg)
И другие возможности ;)
![Page 41: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/41.jpg)
МинусыЕще не реализованы TraitНе хватает оптимизацийВерсия 0.6.1 Alpha (Уже практически Beta)
![Page 42: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/42.jpg)
Zephir RuntimeZephir Runtime - это JIT компилятор встроенный в расширение.
![Page 43: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/43.jpg)
func.zep
fn myFunction(var a) { return 1;}
index.php
include_once 'func.zep';
$result = myFunction(1);var_dump($result);
![Page 44: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/44.jpg)
Будущее ZephirПоддержка PHP 7 (Zend Engine 3)Больше оптимизацийПереработка архитектуры на раздельные компонентыБольше бекендов (PHP, Hack, PHP-CPP)Развитие Zephir RuntimeХотим реализовать ZephirVM*
![Page 45: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/45.jpg)
Phalcon 2Переписан на Zephir99.99% Совместимый фреймворкУлучшенная кодовая базаУлучшены тесты
![Page 46: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/46.jpg)
Как установить налокале?
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](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/47.jpg)
Ну а вообщеAnsible, Chef или Puppet
![Page 48: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/48.jpg)
Как разрабатывать?Берем виртуалку на Vagrant +
VirtualBox *LXC (Linux Kernel Containers) ****Parallels под OSX ***VMWare (Плагин платный) ***
![Page 49: Сладкое будущее: Phalcon и Zephir](https://reader034.vdocuments.mx/reader034/viewer/2022050723/55a78c561a28ab2b6e8b47bc/html5/thumbnails/49.jpg)
Сообщество Phalcon и ZephirСайтФорумыГруппы для Phalcon и Zephir в ВКонтактеЧатик на ГиттерБлогиТвиттер