SlideShare a Scribd company logo
1 of 37
Download to read offline
Confidential - © All rights reserved. Zend Technologies, Inc.1
Copyright - © All rights reserved. Zend Technologies, Inc.
PHP7
Dmitry Stogov
Copyright - © All rights reserved. Zend Technologies, Inc.2
Кто Я?
●
Работаю в IT с 1991
●
Первое знакомство с PHP в 2002
●
Автор Turck MMCache (eAccelerator)
●
Работаю в Zend Technologies с 2004
●
Автор ext/soap
●
Автор pecl/perl
●
Один из ведущих разработчиков PHP
●
Майнтэйнер Zend OPcache
●
Лидер проекта PHPNG
Copyright - © All rights reserved. Zend Technologies, Inc.3
PHPNG (New Generation)
●
Рефакторинг
●
Основная цель — повысить производительность путем изменения
базовых структур данных и заложить фундамент для будущих
улучшений
●
Ответвление от главной ветки PHP в Январе 2014
●
Никаких изменений для пользователей (только внутренности)
●
100% совместимость в поведении с PHP-5.6
●
Две недели ушло только на то, что бы скомпилировать ядро
●
Еще через две недели мы смогли запустить bench.php
●
Еще 1.5 месяца потребовалось, что бы запустить Wordpress
●
Еще через месяц (в начале Мая) мы открыли исходники проекта
●
Смержен обратно в главную ветку, как база для PHP7 в Августе 2014
Copyright - © All rights reserved. Zend Technologies, Inc.4
PHP7
●
Было решено после PHP5 выпускать PHP7,
пропустив PHP6
●
PHP7 несет несколько значительных
нововведений
●
Множество изменений во внутренних API
●
Чистка и удаление устаревших фич
●
Закрыт для добавления новых фич с Марта 2015
●
Релиз PHP-7.0.0RC1 в Июне 2015
●
GA релиз запланирован на Октябрь 2015
●
PHP приложения и расширения могут потребовать
адаптации
Copyright - © All rights reserved. Zend Technologies, Inc.5
PHP7 Основные Изменения
●
Новый уровень производительности
●
Scalar type hints and return types
●
EngineExceptions вместо фатальных ошибок
●
Uniform variable syntax
●
Анонимные классы
●
Zero-cost assert()
●
Generator delegation and return expressions
●
Новые операторы <=> и ??
●
Новые функции random_bytes(), random_int(), intdiv(),
preg_replace_callback_array(), Closure::call()
●
Новый класс IntlChar
●
Эскейп последовательность для Unicode
●
Чистка поведения (foreach, list, switch/default, деление на
ноль, конвертация NaN и INF, сдвиг)
Copyright - © All rights reserved. Zend Technologies, Inc.6
Производительность PHP7
0 2 4 6 8 10 12 14
12.68
12.54
4.68
4.2
2.91
2.18
2.03
1.92
0.78
0.35
bench.php [sec]
4.4
5.0 - Jul 2004
5.1 - Nov 2005
5.2 - Nov 2006
5.3 - Nov 2009
5.4 - Mar 2012
5.5 - Jun 2013
5.6 -Aug 2014
7.0 (Jun 2015)
HHVM-3.7.1
sec
Copyright - © All rights reserved. Zend Technologies, Inc.7
Производительность PHP7
0 50 100 150 200 250
54
51
56
67
76
91
93
101
215
203
Wordpress-3.6.0 Home Page [req/sec]
4.4
5.0 - Jul 2004
5.1 - Nov 2005
5.2 - Nov 2006
5.3 - Nov 2009
5.4 - Mar 2012
5.5 - Jun 2013
5.6 -Aug 2014
7.0 (Jun 2015)
HHVM-3.7.1
req/sec
Copyright - © All rights reserved. Zend Technologies, Inc.8
Производительность PHP7
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun
0
5
10
15
20
25
30
24.04 24.04 24.04
22.64
18.62
16.37
15.28 14.86
14.16 13.83 13.56 13.28
12.58 12.39
11.67 11.48 11.08 11.04
sec
●
Время исполнения 1000 запросов к Wordpress-3.6.0
●
php-cgi -T 1000 /.../wordpress/index.php > /dev/null
Copyright - © All rights reserved. Zend Technologies, Inc.9
PHP-5.6 PHP-7 difference
HHVM-
3.7.1
difference
ZF1 Hello 1,144 2,055 80% 1,394 47%
ZF2 Test 258 520 102% 370 41%
Drupal 7 192 336 75% 308 9%
SugarCRM (login) 134 279 108% 189 48%
Magento (home) 43 70 63% 62 13%
Mediawiki 46 75 63% 85 -12%
Laravel 304 523 72% 410 28%
Производительность PHP7 [req/sec]
Copyright - © All rights reserved. Zend Technologies, Inc.10
Производительность PHP7 глазами Facebook
Copyright - © All rights reserved. Zend Technologies, Inc.11
Scalar type hints
●
4 предопределенных скалярных типа: bool, int, float, string
●
Классы с такими именами теперь запрещены (а так же классы с
именами false, true и null)
●
Определение типа гарантирует тип аргумента внутри функции (если
тип параметра не соответствует, но совместим, он будет
сконвертирован, иначе будет вызвано исключение TypeException).
●
По умолчанию используется нестрогое соответствие типов (те же
правила, которые испльзовались для проверки соответствия типов
внутренних функций в PHP5)
●
Больше нет E_RECOVERABLE_ERROR при несоответствии типов
function add(int $a, int $b) {
return $a + $b;
}
var_dump(foo(5, "3")); // int(5)
var_dump(foo(5, "abc")); // throws TypeException
Copyright - © All rights reserved. Zend Technologies, Inc.12
Scalar type hints (strict mode)
●
Определенный и фактический типы должны быть
идентичны (за исключением конвертации int → float).
●
declare(strict_types=1) должен быть самым первым
оператором в файле
●
declare(strict_types=1) определяет поведение
вызываемых функций (а не определяемых).
●
Поведение вызываемых внутренних функций так же
изменяется
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
var_dump(foo(5, "3")); // throws TypeException
Copyright - © All rights reserved. Zend Technologies, Inc.13
Scalar type hints (strict mode)
<?php
declare(strict_types=0);
function add(int $a, int $b) {
return $a + $b;
}
<?php
declare(strict_types=1);
function add(int $a, int $b) {
return $a + $b;
}
<?php
declare(strict_types=0);
include("add1.php");
var_dump(foo(5, "3")); // int(8)
<?php
declare(strict_types=0);
include("add2.php");
var_dump(foo(5, "3")); // int(8)
<?php
declare(strict_types=1);
include("add1.php");
var_dump(foo(5, "3")); // exception
<?php
declare(strict_types=1);
include("add2.php");
var_dump(foo(5, "3")); // exception
Copyright - © All rights reserved. Zend Technologies, Inc.14
Return type hints
●
Можно определить тип возвращаемого значения, как
скалярный (bool, int, float, string), array или имя класса
●
Правила совместимости типов такие же, как и для
параметров
●
Strict mode определяет поведение определяемой
функции (а не вызываемой)
●
No nullable declarations (мы не можем вернуть NULL,
если фунция определена, как возвращающая объект
класса)
function foo($a): int {
return $a;
}
var_dump(foo(“3”)); // int(3)
Copyright - © All rights reserved. Zend Technologies, Inc.15
Engine Exceptions
●
Почти все фатальные ошибки времени исполнения заменены
на исключения EngineException
●
Parser errors заменены на ParserException
●
Ошибки компиляции остались фатальными
●
BaseException общий базовый класс для Exception,
EngineException и ParserException
●
Приложения могут ловить новые исключительные ситуации и
востанавливаться.
●
Изменился формат сообщений об ошибках (Fatal error:
Uncaught EngineException: … + backtrace)
try {
invalid_func();
} catch (EngineException $e) {
echo $e->getMessage(); // Call to undefined function invalid_func()
}
Copyright - © All rights reserved. Zend Technologies, Inc.16
Uniform Variable Syntax
●
Единообразный и полный синтаксис для доступа к
элементам переменных
●
Элементы могут использоваться в любом порядке
– Foo::$a[1](2)->c[3]
– foo()();
– echo (function add($a,$b){return $a+$b;})(5, 3); // 8
●
Изменен приоритет орератора обращения к
переменной по имени ($$)
syntax old meaning new meaning
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']()
Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
Copyright - © All rights reserved. Zend Technologies, Inc.17
Анонимные классы
●
Похоже на анонимные функции
●
Решение неполное (мы можем только создавать
экземпляры анонимных классов, но не можем
использовать их по другому)
●
get_class() возвращает “искаженное” имя
System::setLogger(new class($file) inmlements AbstaractLogger {
function __construct($file) {
$this->file = $file;
}
function log($msg) {
fprintf($this->file, “%sn”, $msg);
}
});
Copyright - © All rights reserved. Zend Technologies, Inc.18
Zero-cost assert()
●
assert() полезен при отладке, но вызывает накладные
расходы в prodaction
●
PHP7 ввел новую ini директиву zend.assertions
– 1 генерировать и исполнять код проверок
(development)
– 0 генерировать код проверок, но не исполнять его
(production + debugging)
– -1 не генерировать код проверок (zero-cost
production)
●
Возможно переключение между 0 и 1 во время
исполнения для разрешения/запрещения проверок
●
Так же assert() может вызывать исключения
AssertException, если поставить assert.exception=1
Copyright - © All rights reserved. Zend Technologies, Inc.19
Generator delegation
●
Введен новый синтаксис yield from для делегирования значений,
возвращаемых генератором массиву или объекту Traversable
●
Генераторы также являются Traversable
●
Generator::send() передает значение делегированому генератору
●
Позволяет разбивать генераторы на простые части
●
Разрешает кооперативную многозадачность (используя yield from
вместо return)
●
Ключи, возвращаемые из составного генератора, могут повторяться
function gen() {
foreach ([1,2,3] as $v) yield $v;
}
foreach (gen() as $v) {var_dump($v);} // 1,2,3
function gen2() {
yield from gen();
yield from [4,5,6];
}
foreach (gen2() as $v) {var_dump($v);} // 1,2,3,4,5,6
Copyright - © All rights reserved. Zend Technologies, Inc.20
Generator return expressions
●
В генераторах разрешен оператор return
●
Введен метод Generator::getReturn() для получения
возвращаемого значения
●
Это позволяет определять конечное значение кооперативно-
асинхронных задач
function sum($a) {
$ret = 0;
foreach ($a as $v) {
yield $ret += $v;
}
return $ret;
}
$task = sum([1,2,3,4,5,6,7,8,9,10]);
foreach ($task as $tmp) {
echo ".";
}
echo $task->getReturn(); // ..........55
Copyright - © All rights reserved. Zend Technologies, Inc.21
Новые Операторы
●
$a <=> $b (сравнение или “spaceship”)
– returns -1 if ($a < $b)
– returns 0 if ($a == $b)
– Returns 1 if ($a > $b)
– usort($data, function ($a, $b) { return $a <=> $b;})
●
$a ?? $b (null coalesce)
– isset($a) ? $a : $b
– $username = $_GET['user'] ?? 'guest';
Copyright - © All rights reserved. Zend Technologies, Inc.22
Новые Функции
●
intdiv(int $a, int $b): int
●
function rundom_bytes(int $length): string
●
function rundom_int(int $min, int $max): int
●
function preg_replace_callback_array(array $pattern_map,
$subject [, int $limit [, int &$count]])
$validator = function ($num) {
if ($this->num !== $num) ...
}
$num = 0;
foreach ($children as $obj) {
$validator::call($obj, ++$n);
}
preg_replace_callback_array([
“/<([A-Z]*)>/m” => function ($matches) {…},
“/<(//[A-Z]*)>/m” => function ($matches) {…},
$text);
●
function Closure::call($obj, ...)
Copyright - © All rights reserved. Zend Technologies, Inc.23
Класс IntlChar и эскейп для Unicode
class IntlChar {
const CODEPOINT_...
const PROPERTY_...
const CHAR_CATEGORY_...
const CHAR_DIRECTION_...
const BLOCK_CODE_...
...
static function chr($char);
static function ord($char);
...
static function isUAlphabetic($char): bool;
static function islower($char): bool;
...
static function charDirection($char): int;
static function charType($char): int;
...
static function tolower($char);
static function toupper($char);
}
echo "u{1F602}"; // outputs �
Copyright - © All rights reserved. Zend Technologies, Inc.24
Контекстно зависимый сканнер
●
Теперь возможно использовать зарезервированные слова (if,
do, …) как имена свойств, методов и констант классов
class C {
const global = 1;
public $list = null;
static function if($a) {
return (bool)$a;
}
}
var_dump(C::if(true));
$x = new C;
var_dump($x->list)
var_dump(C::global);
●
Использование некорых слов лимитировано: class, static,
abstract, final, private, protected, public.
●
get_token_all($text, TOKEN_PARSE); // для распознавания слов
Copyright - © All rights reserved. Zend Technologies, Inc.25
Чистка поведения (foreach)
●
foreach для элементов массива по значению не использует и не
модифицирует внутреннюю позицию массива. Внешние
модификации массива игнорируются.
foreach ([1, 2, 3] as $v) {
echo $v . "-" . current($a) . ",";
}
echo “n”;
– PHP 5.6: 1-2,2-2,3-2,
– PHP 7: 1-1,2-1,3-1,
$a = [1, 2, 3]; $b = &$a;
foreach ($a as $v) {
echo $v . ","; unset($a[1]);
}
echo “n”;
– PHP 5.6: 1,3,
– PHP 7: 1,2,3,
Copyright - © All rights reserved. Zend Technologies, Inc.26
Чистка поведения (foreach)
●
foreach для элементов массива по ссылке
изменяет внутреннюю позицию массива на
каждой итерации (как и в PHP5).
– добавленные в конец элементы итерируются
– поддерживаются вложенные итераторы
– Возможно изменение итерируемых массивов
внутренними функциями
●
foreach для свойств объектов (по значению и
ссылке) работает по тем же правилам, что и для
элементов массива по ссылке
●
Смотри https://wiki.php.net/rfc/php7_foreach
Copyright - © All rights reserved. Zend Technologies, Inc.27
Чистка поведения (присваивание list)
list($a,$b) = "ab";
var_dump($a,$b); // NULL, NULL
$a[0] = "ab";
list($a,$b) = $a[0];
var_dump($a,$b); // “a”, “b” (undocumented)
●
PHP 5
●
В PHP 7 поведение однозначно определено
list($a,$b) = "ab";
var_dump($a,$b); // NULL, NULL
$a[0] = "ab";
list($a,$b) = $a[0];
var_dump($a,$b); // NULL, NULL
Copyright - © All rights reserved. Zend Technologies, Inc.28
Чиска поведения (switch с двумя default)
●
PHP 5 напечатает … ?
●
В PHP 7 switch с несколькими default запрещен
– PHP Fatal error: Switch statements may only contain
one default clause
$n = 4;
switch($n) {
case 1: echo “1”;
case 2: echo “2”;
case 3: echo “3”;
default: echo “4”;
case 5: echo “5”;
case 6: echo “6”;
default: echo “7”;
case 8: echo “8”;
}
Copyright - © All rights reserved. Zend Technologies, Inc.29
Чиска поведения (математика)
●
Конвертация NaN и INF в целое число дает 0
var_dump((int)NAN);
// int(-9223372036854775808) → int(0)
var_dump((int)INF);
// int(4611686018427387904) → int(0)
●
Сдвиг на отрицательное число бит запрещен
var_dump($x << -1);
// int(...) → Exception: Bit shift by negative number
●
Сдвиг на число бит, превышающее разрядность, дает 0 (вск
биты 0) или -1 (все биты 1)
var_dump(1 << 65);
// int(2) → int(0)
var_dump(-3 >>65);
// int(.-2) → int(-1)
●
Деление на ноль вызывает предупреждение и возвращает
INF
●
Остаток от деления на ноль вызывает исключение "Division
by zero"
Copyright - © All rights reserved. Zend Technologies, Inc.30
Чистка поведения (несовместимый контекст)
●
Удалена поддержка вызова методов объектов (non static) из
несовместимого контекста c использованием синтаксиса
вызова статических методов
class A {
public function test() { var_dump($this); }
}
class B { // Note: B does NOT extend A
public function callNonStaticMethodOfA() { A::test(); }
}
$b = new B;
$b->callNonStaticMethodOfA();
// Deprecated: Non-static method A::test() should not be called statically
// Notice: Undefined variable $this
NULL
// (in PHP-5 it was object(B))
Copyright - © All rights reserved. Zend Technologies, Inc.31
Конструкторы в стиле PHP4
●
Поддержка конструкторов в стиле PHP-4 объявлена
устаревшей
class A {
function A() { // use “function __construct()” instead
$this->x = 100;
}
}
$a = new A();
var_dump($a->x);
// Было
int(100);
// Стало
PHP Deprecated: Methods with the same name as their class will not be
constructors in a future version of PHP; A has a deprecated constructor
int(100)
Copyright - © All rights reserved. Zend Technologies, Inc.32
Чистка поведения (другое)
●
Присваивание по ссылке сначала вычисляет левое
выражение
$a = []; $a["a"] =& $a["b"]; $a["a"] = 1;
// ["b" => 1, "a" => 1] → ["a" => 1, "b" => 1]
●
Присваивание в list вычисляет выражения слева на право
list($a[], $a[]) = [1, 2];
// [2, 1] → [1, 2]
●
Запрещены параметры с одинаковыми именами
function foo($_, $_) {}
●
func_get_arg(), func_get_args() не показывают оригинальные
значения параметров
function foo($a) {$a=2; var_dump(func_get_arg(1));} foo(1);
// 1 → 2
●
Шестнадцатеричные числа в строках больше не
поддерживаются
var_dump("0x123" == "291")
// true → false
Copyright - © All rights reserved. Zend Technologies, Inc.33
PHP7 Основные Изменения
●
Удалены расширения (mssql, sybase, mysql, ereg)
●
Удалена поддержка неподдерживаемых Web серверов (IIS,
Apache 1.*, AOL, tux, ...)
●
Удалена поддержка альтернативных PHP тэгов (<%, <%=)
●
Внутренние изменения
– Рефакторинг базовых струтур данных и API (PHPNG)
– Компилятор использует AST (Abstract Syntax Tree)
– Лучшая поддержка 64-битных платформ
– Native TLS (Thread Local Storage) (TSRM macros)
– Быстрое API для разбора параметров внутренних функций
– ext/json заменен на jsond
Copyright - © All rights reserved. Zend Technologies, Inc.34
opcache.file_cahe (experimenal)
●
PHP7 opcache дает возможность дополнительно
кэшировать скрипты на диске (запрещено по
умолчанию)
●
configure … --enable-opcache-file
●
mkdir /tmp/opcahe
●
Додавить opcache.file_cahce=/tmp/opcache в
php.ini
●
Уменьшает пиковые нагрузки при рестарте PHP и
переполнении SHM кэша
●
Улучшает время отклика в эти моменты в 2-3 раза
●
Может использоваться в сценариях апгрейда
(можно предварительно загрузить дисковый кэш)
●
file_cache может работать вообще без SHM
Copyright - © All rights reserved. Zend Technologies, Inc.35
Хотите еще быстрее – HUGE TLB / HUGE PAGE
●
CPU использует виртуальную память с 4KB страницам
●
CPU TLB cahce содержит всего 64-512 entries => 256KB-2M
●
TLB промахи требуют много времени для обработки
●
Решение – страницы размером 2MB
●
PHP-7, если может, использует 2M страницы для менеджера
памяти и разделяемой памяти opcahce, где хранятся
скомпилированые скрипты
●
grep "Huge" /proc/meminfo
AnonHugePages: 2048 kB
HugePages_Total: 512
HugePages_Free: 504
HugePages_Rsvd: 56
HugePages_Surp: 0
Hugepagesize: 2048 kB
●
https://wiki.debian.org/Hugepages#Enabling_HugeTlbPage
Copyright - © All rights reserved. Zend Technologies, Inc.36
Хотите еще быстрее – PGO/FDO build
●
make prof-gen
●
sapi/cgi/php-cgi -T 3000
/.../wordpress/index.php > /dev/null
●
make prof-clean
●
make prof-use
●
Скорость +8%
●
Объем кода -8% (size sapi/cli/php)
Confidential - © All rights reserved. Zend Technologies, Inc.37
Questions?

More Related Content

What's hot

Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьYauheni Akhotnikau
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
File input/output in VHDL
File input/output in VHDLFile input/output in VHDL
File input/output in VHDLvitaliykulanov
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stlmcroitor
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 

What's hot (20)

Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Fody - AOP
Fody - AOPFody - AOP
Fody - AOP
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная часть
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
JRebel
JRebelJRebel
JRebel
 
File input/output in VHDL
File input/output in VHDLFile input/output in VHDL
File input/output in VHDL
 
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 

Viewers also liked

How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016Badoo
 
PHP7 - The New Engine for old good train
PHP7 - The New Engine for old good trainPHP7 - The New Engine for old good train
PHP7 - The New Engine for old good trainXinchen Hui
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo Development
 
Weaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryWeaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryAlexander Lisachenko
 
Technology and the global world to family
Technology and the global world to familyTechnology and the global world to family
Technology and the global world to familyLeslie Méndez
 
Fun and games
Fun and gamesFun and games
Fun and gameshallarmh
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3edanwade
 
тест
тесттест
тестsaraa79
 
1 dissertation guidelines_v3_2011_cohort
1 dissertation guidelines_v3_2011_cohort1 dissertation guidelines_v3_2011_cohort
1 dissertation guidelines_v3_2011_cohortVamsi Krishnareddy
 
Bio 120 presentation 1
Bio 120 presentation 1Bio 120 presentation 1
Bio 120 presentation 1desntay2
 
Catholic cross culutral servicesl - nov 21, 2010
Catholic cross  culutral servicesl - nov 21, 2010Catholic cross  culutral servicesl - nov 21, 2010
Catholic cross culutral servicesl - nov 21, 2010The Scarborough Hospital
 
Competències, canvi curricular i millora educativa: una relació problemàtica
Competències, canvi curricular i millora educativa: una relació problemàticaCompetències, canvi curricular i millora educativa: una relació problemàtica
Competències, canvi curricular i millora educativa: una relació problemàticaICE_URV_NU
 
Business leaders' briefing 24.09.2014
Business leaders' briefing 24.09.2014Business leaders' briefing 24.09.2014
Business leaders' briefing 24.09.2014newcastlegateshead
 
El planeta terra
El planeta terraEl planeta terra
El planeta terradavidmanx
 
Chapter 10 presentation
Chapter 10 presentationChapter 10 presentation
Chapter 10 presentationdesntay2
 
Rome slideshow in order
Rome slideshow in orderRome slideshow in order
Rome slideshow in orderbbullentini78
 

Viewers also liked (20)

How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
 
PHP7 - The New Engine for old good train
PHP7 - The New Engine for old good trainPHP7 - The New Engine for old good train
PHP7 - The New Engine for old good train
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Weaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP libraryWeaving aspects in PHP with the help of Go! AOP library
Weaving aspects in PHP with the help of Go! AOP library
 
Technology and the global world to family
Technology and the global world to familyTechnology and the global world to family
Technology and the global world to family
 
Fun and games
Fun and gamesFun and games
Fun and games
 
Health System Transformation
Health System TransformationHealth System Transformation
Health System Transformation
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3
 
тест
тесттест
тест
 
Centrifuge slide show
Centrifuge slide showCentrifuge slide show
Centrifuge slide show
 
1 dissertation guidelines_v3_2011_cohort
1 dissertation guidelines_v3_2011_cohort1 dissertation guidelines_v3_2011_cohort
1 dissertation guidelines_v3_2011_cohort
 
Bio 120 presentation 1
Bio 120 presentation 1Bio 120 presentation 1
Bio 120 presentation 1
 
Catholic cross culutral servicesl - nov 21, 2010
Catholic cross  culutral servicesl - nov 21, 2010Catholic cross  culutral servicesl - nov 21, 2010
Catholic cross culutral servicesl - nov 21, 2010
 
Competències, canvi curricular i millora educativa: una relació problemàtica
Competències, canvi curricular i millora educativa: una relació problemàticaCompetències, canvi curricular i millora educativa: una relació problemàtica
Competències, canvi curricular i millora educativa: una relació problemàtica
 
Business leaders' briefing 24.09.2014
Business leaders' briefing 24.09.2014Business leaders' briefing 24.09.2014
Business leaders' briefing 24.09.2014
 
El planeta terra
El planeta terraEl planeta terra
El planeta terra
 
Chapter 10 presentation
Chapter 10 presentationChapter 10 presentation
Chapter 10 presentation
 
Afstudeer presentatie
Afstudeer presentatieAfstudeer presentatie
Afstudeer presentatie
 
Calterna
CalternaCalterna
Calterna
 
Rome slideshow in order
Rome slideshow in orderRome slideshow in order
Rome slideshow in order
 

Similar to Релиз PHP7 - что нас ждет в октябре 2015

Дмитрий Стогов
Дмитрий СтоговДмитрий Стогов
Дмитрий СтоговCodeFest
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василийsolit
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычностьStepan Tanasiychuk
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugAndrey Tokarchuk
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовMskDotNet Community
 

Similar to Релиз PHP7 - что нас ждет в октябре 2015 (20)

Дмитрий Стогов
Дмитрий СтоговДмитрий Стогов
Дмитрий Стогов
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmug
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
php frameworks
php frameworksphp frameworks
php frameworks
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 

More from Andrey Tokarchuk

Интеллектуальная собственность в IT
Интеллектуальная собственность в ITИнтеллектуальная собственность в IT
Интеллектуальная собственность в ITAndrey Tokarchuk
 
Демонизированный PHP - before it was cool
Демонизированный PHP - before it was coolДемонизированный PHP - before it was cool
Демонизированный PHP - before it was coolAndrey Tokarchuk
 
Тестируем инфраструктуру как код
Тестируем инфраструктуру как кодТестируем инфраструктуру как код
Тестируем инфраструктуру как кодAndrey Tokarchuk
 
писатели юбиляры
писатели юбилярыписатели юбиляры
писатели юбилярыAndrey Tokarchuk
 
Модули в zend framework 2.ростислав михайлив
Модули в zend framework 2.ростислав михайливМодули в zend framework 2.ростислав михайлив
Модули в zend framework 2.ростислав михайливAndrey Tokarchuk
 
Zend cache evolution.владимир дубина
Zend cache   evolution.владимир дубинаZend cache   evolution.владимир дубина
Zend cache evolution.владимир дубинаAndrey Tokarchuk
 
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопив
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопивОчередь задач и многопоточность с помощью gearman и zf.станислав прокопив
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопивAndrey Tokarchuk
 
Highload не кусается.антон шевчук
Highload не кусается.антон шевчукHighload не кусается.антон шевчук
Highload не кусается.антон шевчукAndrey Tokarchuk
 
Соблазнительные формы в zend framework 2.даниил кожемяко
Соблазнительные формы в zend framework 2.даниил кожемякоСоблазнительные формы в zend framework 2.даниил кожемяко
Соблазнительные формы в zend framework 2.даниил кожемякоAndrey Tokarchuk
 
mms или как просто работать с моделями данных.иван кутузов
mms или как просто работать с моделями данных.иван кутузовmms или как просто работать с моделями данных.иван кутузов
mms или как просто работать с моделями данных.иван кутузовAndrey Tokarchuk
 
Cобытийная модель zend framework 2, event manager. александр вронский
Cобытийная модель zend framework 2, event manager. александр вронскийCобытийная модель zend framework 2, event manager. александр вронский
Cобытийная модель zend framework 2, event manager. александр вронскийAndrey Tokarchuk
 

More from Andrey Tokarchuk (20)

Nsx 6.2
Nsx 6.2Nsx 6.2
Nsx 6.2
 
Vrealize automotion
Vrealize automotionVrealize automotion
Vrealize automotion
 
Vmware any-cloud
Vmware any-cloudVmware any-cloud
Vmware any-cloud
 
Nvidia grid-2
Nvidia grid-2Nvidia grid-2
Nvidia grid-2
 
Интеллектуальная собственность в IT
Интеллектуальная собственность в ITИнтеллектуальная собственность в IT
Интеллектуальная собственность в IT
 
Демонизированный PHP - before it was cool
Демонизированный PHP - before it was coolДемонизированный PHP - before it was cool
Демонизированный PHP - before it was cool
 
Тестируем инфраструктуру как код
Тестируем инфраструктуру как кодТестируем инфраструктуру как код
Тестируем инфраструктуру как код
 
OpenStack сегодня
OpenStack сегодняOpenStack сегодня
OpenStack сегодня
 
писатели юбиляры
писатели юбилярыписатели юбиляры
писатели юбиляры
 
Модули в zend framework 2.ростислав михайлив
Модули в zend framework 2.ростислав михайливМодули в zend framework 2.ростислав михайлив
Модули в zend framework 2.ростислав михайлив
 
Zend cache evolution.владимир дубина
Zend cache   evolution.владимир дубинаZend cache   evolution.владимир дубина
Zend cache evolution.владимир дубина
 
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопив
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопивОчередь задач и многопоточность с помощью gearman и zf.станислав прокопив
Очередь задач и многопоточность с помощью gearman и zf.станислав прокопив
 
Highload не кусается.антон шевчук
Highload не кусается.антон шевчукHighload не кусается.антон шевчук
Highload не кусается.антон шевчук
 
Соблазнительные формы в zend framework 2.даниил кожемяко
Соблазнительные формы в zend framework 2.даниил кожемякоСоблазнительные формы в zend framework 2.даниил кожемяко
Соблазнительные формы в zend framework 2.даниил кожемяко
 
mms или как просто работать с моделями данных.иван кутузов
mms или как просто работать с моделями данных.иван кутузовmms или как просто работать с моделями данных.иван кутузов
mms или как просто работать с моделями данных.иван кутузов
 
Cобытийная модель zend framework 2, event manager. александр вронский
Cобытийная модель zend framework 2, event manager. александр вронскийCобытийная модель zend framework 2, event manager. александр вронский
Cобытийная модель zend framework 2, event manager. александр вронский
 
My sql
My sqlMy sql
My sql
 
Mongo
MongoMongo
Mongo
 
Rasmus
RasmusRasmus
Rasmus
 
Rails and security
Rails and securityRails and security
Rails and security
 

Релиз PHP7 - что нас ждет в октябре 2015

  • 1. Confidential - © All rights reserved. Zend Technologies, Inc.1 Copyright - © All rights reserved. Zend Technologies, Inc. PHP7 Dmitry Stogov
  • 2. Copyright - © All rights reserved. Zend Technologies, Inc.2 Кто Я? ● Работаю в IT с 1991 ● Первое знакомство с PHP в 2002 ● Автор Turck MMCache (eAccelerator) ● Работаю в Zend Technologies с 2004 ● Автор ext/soap ● Автор pecl/perl ● Один из ведущих разработчиков PHP ● Майнтэйнер Zend OPcache ● Лидер проекта PHPNG
  • 3. Copyright - © All rights reserved. Zend Technologies, Inc.3 PHPNG (New Generation) ● Рефакторинг ● Основная цель — повысить производительность путем изменения базовых структур данных и заложить фундамент для будущих улучшений ● Ответвление от главной ветки PHP в Январе 2014 ● Никаких изменений для пользователей (только внутренности) ● 100% совместимость в поведении с PHP-5.6 ● Две недели ушло только на то, что бы скомпилировать ядро ● Еще через две недели мы смогли запустить bench.php ● Еще 1.5 месяца потребовалось, что бы запустить Wordpress ● Еще через месяц (в начале Мая) мы открыли исходники проекта ● Смержен обратно в главную ветку, как база для PHP7 в Августе 2014
  • 4. Copyright - © All rights reserved. Zend Technologies, Inc.4 PHP7 ● Было решено после PHP5 выпускать PHP7, пропустив PHP6 ● PHP7 несет несколько значительных нововведений ● Множество изменений во внутренних API ● Чистка и удаление устаревших фич ● Закрыт для добавления новых фич с Марта 2015 ● Релиз PHP-7.0.0RC1 в Июне 2015 ● GA релиз запланирован на Октябрь 2015 ● PHP приложения и расширения могут потребовать адаптации
  • 5. Copyright - © All rights reserved. Zend Technologies, Inc.5 PHP7 Основные Изменения ● Новый уровень производительности ● Scalar type hints and return types ● EngineExceptions вместо фатальных ошибок ● Uniform variable syntax ● Анонимные классы ● Zero-cost assert() ● Generator delegation and return expressions ● Новые операторы <=> и ?? ● Новые функции random_bytes(), random_int(), intdiv(), preg_replace_callback_array(), Closure::call() ● Новый класс IntlChar ● Эскейп последовательность для Unicode ● Чистка поведения (foreach, list, switch/default, деление на ноль, конвертация NaN и INF, сдвиг)
  • 6. Copyright - © All rights reserved. Zend Technologies, Inc.6 Производительность PHP7 0 2 4 6 8 10 12 14 12.68 12.54 4.68 4.2 2.91 2.18 2.03 1.92 0.78 0.35 bench.php [sec] 4.4 5.0 - Jul 2004 5.1 - Nov 2005 5.2 - Nov 2006 5.3 - Nov 2009 5.4 - Mar 2012 5.5 - Jun 2013 5.6 -Aug 2014 7.0 (Jun 2015) HHVM-3.7.1 sec
  • 7. Copyright - © All rights reserved. Zend Technologies, Inc.7 Производительность PHP7 0 50 100 150 200 250 54 51 56 67 76 91 93 101 215 203 Wordpress-3.6.0 Home Page [req/sec] 4.4 5.0 - Jul 2004 5.1 - Nov 2005 5.2 - Nov 2006 5.3 - Nov 2009 5.4 - Mar 2012 5.5 - Jun 2013 5.6 -Aug 2014 7.0 (Jun 2015) HHVM-3.7.1 req/sec
  • 8. Copyright - © All rights reserved. Zend Technologies, Inc.8 Производительность PHP7 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun 0 5 10 15 20 25 30 24.04 24.04 24.04 22.64 18.62 16.37 15.28 14.86 14.16 13.83 13.56 13.28 12.58 12.39 11.67 11.48 11.08 11.04 sec ● Время исполнения 1000 запросов к Wordpress-3.6.0 ● php-cgi -T 1000 /.../wordpress/index.php > /dev/null
  • 9. Copyright - © All rights reserved. Zend Technologies, Inc.9 PHP-5.6 PHP-7 difference HHVM- 3.7.1 difference ZF1 Hello 1,144 2,055 80% 1,394 47% ZF2 Test 258 520 102% 370 41% Drupal 7 192 336 75% 308 9% SugarCRM (login) 134 279 108% 189 48% Magento (home) 43 70 63% 62 13% Mediawiki 46 75 63% 85 -12% Laravel 304 523 72% 410 28% Производительность PHP7 [req/sec]
  • 10. Copyright - © All rights reserved. Zend Technologies, Inc.10 Производительность PHP7 глазами Facebook
  • 11. Copyright - © All rights reserved. Zend Technologies, Inc.11 Scalar type hints ● 4 предопределенных скалярных типа: bool, int, float, string ● Классы с такими именами теперь запрещены (а так же классы с именами false, true и null) ● Определение типа гарантирует тип аргумента внутри функции (если тип параметра не соответствует, но совместим, он будет сконвертирован, иначе будет вызвано исключение TypeException). ● По умолчанию используется нестрогое соответствие типов (те же правила, которые испльзовались для проверки соответствия типов внутренних функций в PHP5) ● Больше нет E_RECOVERABLE_ERROR при несоответствии типов function add(int $a, int $b) { return $a + $b; } var_dump(foo(5, "3")); // int(5) var_dump(foo(5, "abc")); // throws TypeException
  • 12. Copyright - © All rights reserved. Zend Technologies, Inc.12 Scalar type hints (strict mode) ● Определенный и фактический типы должны быть идентичны (за исключением конвертации int → float). ● declare(strict_types=1) должен быть самым первым оператором в файле ● declare(strict_types=1) определяет поведение вызываемых функций (а не определяемых). ● Поведение вызываемых внутренних функций так же изменяется declare(strict_types=1); function add(int $a, int $b) { return $a + $b; } var_dump(foo(5, "3")); // throws TypeException
  • 13. Copyright - © All rights reserved. Zend Technologies, Inc.13 Scalar type hints (strict mode) <?php declare(strict_types=0); function add(int $a, int $b) { return $a + $b; } <?php declare(strict_types=1); function add(int $a, int $b) { return $a + $b; } <?php declare(strict_types=0); include("add1.php"); var_dump(foo(5, "3")); // int(8) <?php declare(strict_types=0); include("add2.php"); var_dump(foo(5, "3")); // int(8) <?php declare(strict_types=1); include("add1.php"); var_dump(foo(5, "3")); // exception <?php declare(strict_types=1); include("add2.php"); var_dump(foo(5, "3")); // exception
  • 14. Copyright - © All rights reserved. Zend Technologies, Inc.14 Return type hints ● Можно определить тип возвращаемого значения, как скалярный (bool, int, float, string), array или имя класса ● Правила совместимости типов такие же, как и для параметров ● Strict mode определяет поведение определяемой функции (а не вызываемой) ● No nullable declarations (мы не можем вернуть NULL, если фунция определена, как возвращающая объект класса) function foo($a): int { return $a; } var_dump(foo(“3”)); // int(3)
  • 15. Copyright - © All rights reserved. Zend Technologies, Inc.15 Engine Exceptions ● Почти все фатальные ошибки времени исполнения заменены на исключения EngineException ● Parser errors заменены на ParserException ● Ошибки компиляции остались фатальными ● BaseException общий базовый класс для Exception, EngineException и ParserException ● Приложения могут ловить новые исключительные ситуации и востанавливаться. ● Изменился формат сообщений об ошибках (Fatal error: Uncaught EngineException: … + backtrace) try { invalid_func(); } catch (EngineException $e) { echo $e->getMessage(); // Call to undefined function invalid_func() }
  • 16. Copyright - © All rights reserved. Zend Technologies, Inc.16 Uniform Variable Syntax ● Единообразный и полный синтаксис для доступа к элементам переменных ● Элементы могут использоваться в любом порядке – Foo::$a[1](2)->c[3] – foo()(); – echo (function add($a,$b){return $a+$b;})(5, 3); // 8 ● Изменен приоритет орератора обращения к переменной по имени ($$) syntax old meaning new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
  • 17. Copyright - © All rights reserved. Zend Technologies, Inc.17 Анонимные классы ● Похоже на анонимные функции ● Решение неполное (мы можем только создавать экземпляры анонимных классов, но не можем использовать их по другому) ● get_class() возвращает “искаженное” имя System::setLogger(new class($file) inmlements AbstaractLogger { function __construct($file) { $this->file = $file; } function log($msg) { fprintf($this->file, “%sn”, $msg); } });
  • 18. Copyright - © All rights reserved. Zend Technologies, Inc.18 Zero-cost assert() ● assert() полезен при отладке, но вызывает накладные расходы в prodaction ● PHP7 ввел новую ini директиву zend.assertions – 1 генерировать и исполнять код проверок (development) – 0 генерировать код проверок, но не исполнять его (production + debugging) – -1 не генерировать код проверок (zero-cost production) ● Возможно переключение между 0 и 1 во время исполнения для разрешения/запрещения проверок ● Так же assert() может вызывать исключения AssertException, если поставить assert.exception=1
  • 19. Copyright - © All rights reserved. Zend Technologies, Inc.19 Generator delegation ● Введен новый синтаксис yield from для делегирования значений, возвращаемых генератором массиву или объекту Traversable ● Генераторы также являются Traversable ● Generator::send() передает значение делегированому генератору ● Позволяет разбивать генераторы на простые части ● Разрешает кооперативную многозадачность (используя yield from вместо return) ● Ключи, возвращаемые из составного генератора, могут повторяться function gen() { foreach ([1,2,3] as $v) yield $v; } foreach (gen() as $v) {var_dump($v);} // 1,2,3 function gen2() { yield from gen(); yield from [4,5,6]; } foreach (gen2() as $v) {var_dump($v);} // 1,2,3,4,5,6
  • 20. Copyright - © All rights reserved. Zend Technologies, Inc.20 Generator return expressions ● В генераторах разрешен оператор return ● Введен метод Generator::getReturn() для получения возвращаемого значения ● Это позволяет определять конечное значение кооперативно- асинхронных задач function sum($a) { $ret = 0; foreach ($a as $v) { yield $ret += $v; } return $ret; } $task = sum([1,2,3,4,5,6,7,8,9,10]); foreach ($task as $tmp) { echo "."; } echo $task->getReturn(); // ..........55
  • 21. Copyright - © All rights reserved. Zend Technologies, Inc.21 Новые Операторы ● $a <=> $b (сравнение или “spaceship”) – returns -1 if ($a < $b) – returns 0 if ($a == $b) – Returns 1 if ($a > $b) – usort($data, function ($a, $b) { return $a <=> $b;}) ● $a ?? $b (null coalesce) – isset($a) ? $a : $b – $username = $_GET['user'] ?? 'guest';
  • 22. Copyright - © All rights reserved. Zend Technologies, Inc.22 Новые Функции ● intdiv(int $a, int $b): int ● function rundom_bytes(int $length): string ● function rundom_int(int $min, int $max): int ● function preg_replace_callback_array(array $pattern_map, $subject [, int $limit [, int &$count]]) $validator = function ($num) { if ($this->num !== $num) ... } $num = 0; foreach ($children as $obj) { $validator::call($obj, ++$n); } preg_replace_callback_array([ “/<([A-Z]*)>/m” => function ($matches) {…}, “/<(//[A-Z]*)>/m” => function ($matches) {…}, $text); ● function Closure::call($obj, ...)
  • 23. Copyright - © All rights reserved. Zend Technologies, Inc.23 Класс IntlChar и эскейп для Unicode class IntlChar { const CODEPOINT_... const PROPERTY_... const CHAR_CATEGORY_... const CHAR_DIRECTION_... const BLOCK_CODE_... ... static function chr($char); static function ord($char); ... static function isUAlphabetic($char): bool; static function islower($char): bool; ... static function charDirection($char): int; static function charType($char): int; ... static function tolower($char); static function toupper($char); } echo "u{1F602}"; // outputs �
  • 24. Copyright - © All rights reserved. Zend Technologies, Inc.24 Контекстно зависимый сканнер ● Теперь возможно использовать зарезервированные слова (if, do, …) как имена свойств, методов и констант классов class C { const global = 1; public $list = null; static function if($a) { return (bool)$a; } } var_dump(C::if(true)); $x = new C; var_dump($x->list) var_dump(C::global); ● Использование некорых слов лимитировано: class, static, abstract, final, private, protected, public. ● get_token_all($text, TOKEN_PARSE); // для распознавания слов
  • 25. Copyright - © All rights reserved. Zend Technologies, Inc.25 Чистка поведения (foreach) ● foreach для элементов массива по значению не использует и не модифицирует внутреннюю позицию массива. Внешние модификации массива игнорируются. foreach ([1, 2, 3] as $v) { echo $v . "-" . current($a) . ","; } echo “n”; – PHP 5.6: 1-2,2-2,3-2, – PHP 7: 1-1,2-1,3-1, $a = [1, 2, 3]; $b = &$a; foreach ($a as $v) { echo $v . ","; unset($a[1]); } echo “n”; – PHP 5.6: 1,3, – PHP 7: 1,2,3,
  • 26. Copyright - © All rights reserved. Zend Technologies, Inc.26 Чистка поведения (foreach) ● foreach для элементов массива по ссылке изменяет внутреннюю позицию массива на каждой итерации (как и в PHP5). – добавленные в конец элементы итерируются – поддерживаются вложенные итераторы – Возможно изменение итерируемых массивов внутренними функциями ● foreach для свойств объектов (по значению и ссылке) работает по тем же правилам, что и для элементов массива по ссылке ● Смотри https://wiki.php.net/rfc/php7_foreach
  • 27. Copyright - © All rights reserved. Zend Technologies, Inc.27 Чистка поведения (присваивание list) list($a,$b) = "ab"; var_dump($a,$b); // NULL, NULL $a[0] = "ab"; list($a,$b) = $a[0]; var_dump($a,$b); // “a”, “b” (undocumented) ● PHP 5 ● В PHP 7 поведение однозначно определено list($a,$b) = "ab"; var_dump($a,$b); // NULL, NULL $a[0] = "ab"; list($a,$b) = $a[0]; var_dump($a,$b); // NULL, NULL
  • 28. Copyright - © All rights reserved. Zend Technologies, Inc.28 Чиска поведения (switch с двумя default) ● PHP 5 напечатает … ? ● В PHP 7 switch с несколькими default запрещен – PHP Fatal error: Switch statements may only contain one default clause $n = 4; switch($n) { case 1: echo “1”; case 2: echo “2”; case 3: echo “3”; default: echo “4”; case 5: echo “5”; case 6: echo “6”; default: echo “7”; case 8: echo “8”; }
  • 29. Copyright - © All rights reserved. Zend Technologies, Inc.29 Чиска поведения (математика) ● Конвертация NaN и INF в целое число дает 0 var_dump((int)NAN); // int(-9223372036854775808) → int(0) var_dump((int)INF); // int(4611686018427387904) → int(0) ● Сдвиг на отрицательное число бит запрещен var_dump($x << -1); // int(...) → Exception: Bit shift by negative number ● Сдвиг на число бит, превышающее разрядность, дает 0 (вск биты 0) или -1 (все биты 1) var_dump(1 << 65); // int(2) → int(0) var_dump(-3 >>65); // int(.-2) → int(-1) ● Деление на ноль вызывает предупреждение и возвращает INF ● Остаток от деления на ноль вызывает исключение "Division by zero"
  • 30. Copyright - © All rights reserved. Zend Technologies, Inc.30 Чистка поведения (несовместимый контекст) ● Удалена поддержка вызова методов объектов (non static) из несовместимого контекста c использованием синтаксиса вызова статических методов class A { public function test() { var_dump($this); } } class B { // Note: B does NOT extend A public function callNonStaticMethodOfA() { A::test(); } } $b = new B; $b->callNonStaticMethodOfA(); // Deprecated: Non-static method A::test() should not be called statically // Notice: Undefined variable $this NULL // (in PHP-5 it was object(B))
  • 31. Copyright - © All rights reserved. Zend Technologies, Inc.31 Конструкторы в стиле PHP4 ● Поддержка конструкторов в стиле PHP-4 объявлена устаревшей class A { function A() { // use “function __construct()” instead $this->x = 100; } } $a = new A(); var_dump($a->x); // Было int(100); // Стало PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor int(100)
  • 32. Copyright - © All rights reserved. Zend Technologies, Inc.32 Чистка поведения (другое) ● Присваивание по ссылке сначала вычисляет левое выражение $a = []; $a["a"] =& $a["b"]; $a["a"] = 1; // ["b" => 1, "a" => 1] → ["a" => 1, "b" => 1] ● Присваивание в list вычисляет выражения слева на право list($a[], $a[]) = [1, 2]; // [2, 1] → [1, 2] ● Запрещены параметры с одинаковыми именами function foo($_, $_) {} ● func_get_arg(), func_get_args() не показывают оригинальные значения параметров function foo($a) {$a=2; var_dump(func_get_arg(1));} foo(1); // 1 → 2 ● Шестнадцатеричные числа в строках больше не поддерживаются var_dump("0x123" == "291") // true → false
  • 33. Copyright - © All rights reserved. Zend Technologies, Inc.33 PHP7 Основные Изменения ● Удалены расширения (mssql, sybase, mysql, ereg) ● Удалена поддержка неподдерживаемых Web серверов (IIS, Apache 1.*, AOL, tux, ...) ● Удалена поддержка альтернативных PHP тэгов (<%, <%=) ● Внутренние изменения – Рефакторинг базовых струтур данных и API (PHPNG) – Компилятор использует AST (Abstract Syntax Tree) – Лучшая поддержка 64-битных платформ – Native TLS (Thread Local Storage) (TSRM macros) – Быстрое API для разбора параметров внутренних функций – ext/json заменен на jsond
  • 34. Copyright - © All rights reserved. Zend Technologies, Inc.34 opcache.file_cahe (experimenal) ● PHP7 opcache дает возможность дополнительно кэшировать скрипты на диске (запрещено по умолчанию) ● configure … --enable-opcache-file ● mkdir /tmp/opcahe ● Додавить opcache.file_cahce=/tmp/opcache в php.ini ● Уменьшает пиковые нагрузки при рестарте PHP и переполнении SHM кэша ● Улучшает время отклика в эти моменты в 2-3 раза ● Может использоваться в сценариях апгрейда (можно предварительно загрузить дисковый кэш) ● file_cache может работать вообще без SHM
  • 35. Copyright - © All rights reserved. Zend Technologies, Inc.35 Хотите еще быстрее – HUGE TLB / HUGE PAGE ● CPU использует виртуальную память с 4KB страницам ● CPU TLB cahce содержит всего 64-512 entries => 256KB-2M ● TLB промахи требуют много времени для обработки ● Решение – страницы размером 2MB ● PHP-7, если может, использует 2M страницы для менеджера памяти и разделяемой памяти opcahce, где хранятся скомпилированые скрипты ● grep "Huge" /proc/meminfo AnonHugePages: 2048 kB HugePages_Total: 512 HugePages_Free: 504 HugePages_Rsvd: 56 HugePages_Surp: 0 Hugepagesize: 2048 kB ● https://wiki.debian.org/Hugepages#Enabling_HugeTlbPage
  • 36. Copyright - © All rights reserved. Zend Technologies, Inc.36 Хотите еще быстрее – PGO/FDO build ● make prof-gen ● sapi/cgi/php-cgi -T 3000 /.../wordpress/index.php > /dev/null ● make prof-clean ● make prof-use ● Скорость +8% ● Объем кода -8% (size sapi/cli/php)
  • 37. Confidential - © All rights reserved. Zend Technologies, Inc.37 Questions?