SlideShare a Scribd company logo
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

PPTX
Что нового в Visual Studio 2010 и .Net 4.0
akrakovetsky
 
PDF
Сладкое будущее: Phalcon и Zephir
CodeFest
 
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
PDF
JavaScript Базовый. Занятие 03.
Igor Shkulipa
 
PPTX
Statements in VHDL - Concurrent Statements
vitaliykulanov
 
PPTX
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
vitaliykulanov
 
PPTX
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
PDF
Component Inspector
Roman Dvornov
 
Что нового в Visual Studio 2010 и .Net 4.0
akrakovetsky
 
Сладкое будущее: Phalcon и Zephir
CodeFest
 
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
JavaScript Базовый. Занятие 03.
Igor Shkulipa
 
Statements in VHDL - Concurrent Statements
vitaliykulanov
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
vitaliykulanov
 
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Component Inspector
Roman Dvornov
 

What's hot (20)

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

Viewers also liked (20)

PDF
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
Badoo
 
PDF
PHP7 - The New Engine for old good train
Xinchen Hui
 
PDF
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo Development
 
ODP
Weaving aspects in PHP with the help of Go! AOP library
Alexander Lisachenko
 
PPTX
Technology and the global world to family
Leslie Méndez
 
PPT
Fun and games
hallarmh
 
PPTX
Health System Transformation
The Scarborough Hospital
 
PPT
Struts1+ hibernate3
edanwade
 
ODS
тест
saraa79
 
PPSX
Centrifuge slide show
jenniferporter
 
DOC
1 dissertation guidelines_v3_2011_cohort
Vamsi Krishnareddy
 
PPTX
Bio 120 presentation 1
desntay2
 
PPT
Catholic cross culutral servicesl - nov 21, 2010
The Scarborough Hospital
 
PPT
Competències, canvi curricular i millora educativa: una relació problemàtica
ICE_URV_NU
 
PPTX
Business leaders' briefing 24.09.2014
newcastlegateshead
 
PPTX
El planeta terra
davidmanx
 
PPTX
Chapter 10 presentation
desntay2
 
PPTX
Afstudeer presentatie
Carien de Heus
 
PDF
Calterna
Leandro __
 
PDF
Rome slideshow in order
bbullentini78
 
How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
Badoo
 
PHP7 - The New Engine for old good train
Xinchen Hui
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo Development
 
Weaving aspects in PHP with the help of Go! AOP library
Alexander Lisachenko
 
Technology and the global world to family
Leslie Méndez
 
Fun and games
hallarmh
 
Health System Transformation
The Scarborough Hospital
 
Struts1+ hibernate3
edanwade
 
тест
saraa79
 
Centrifuge slide show
jenniferporter
 
1 dissertation guidelines_v3_2011_cohort
Vamsi Krishnareddy
 
Bio 120 presentation 1
desntay2
 
Catholic cross culutral servicesl - nov 21, 2010
The Scarborough Hospital
 
Competències, canvi curricular i millora educativa: una relació problemàtica
ICE_URV_NU
 
Business leaders' briefing 24.09.2014
newcastlegateshead
 
El planeta terra
davidmanx
 
Chapter 10 presentation
desntay2
 
Afstudeer presentatie
Carien de Heus
 
Calterna
Leandro __
 
Rome slideshow in order
bbullentini78
 
Ad

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

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

More from Andrey Tokarchuk (20)

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

Релиз 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?