Php 7 изменения. Автономный многопоточный веб-сервер

Материал в этой статье устарел. По сути, здесь изложены догадки о PHP 7, когда ещё не были доступны альфы. На текущий момент доступна уже вторая бета (а очень скоро появится и стабильный релиз). Теперь уже совершенно определённо можно сказать о нововведениях в PHP 7:

  • Увеличение производительности PHP 7 до двух раз по сравнению с PHP 5.6
  • Ожидаемая поддержка 64-бит
  • Многие фатальные ошибки теперь Exceptions (исключения)
  • Удаление старых и не поддерживаемых SAPI (программных интерфейсов серверных приложений) и расширений
  • Оператор NULL коалесцирующий (??)
  • Комбинированный оператор сравнения (<=>)
  • Декларация возвращаемого типа
  • Декларация скалярного типа
  • Анонимные классы

Эта верхушка айсберга изменений, подробности о переходе с предыдущих версий PHP на PHP7 можно почитать .

Более того, уже сейчас можно попробовать PHP 7 и на Linux и на Windows:

И даже уже есть готовая сборка сервера с PHP 7: « .

Тем не менее, я не отговариваю вас от чтения данной статьи. Вполне возможно, то, что изложено здесь, всё-таки будет реализовано в PHP 8.

Главные особенности PHP 7

Полный набор нововведений PHP 7 до сих пор ещё не определён. Но о некоторых мы можем уже говорить, т. к. они уже стали реализованными. О других мы можем только предполагать, основываясь на косвенных признаках.

Кстати, ещё до выхода PHP 7 весьма вероятно выйдет PHP 5.7.

1. Огромное улучшение производительности

Главной целью PHPNG было привнесение улучшений производительности, чтобы, по крайней мере, соответствовать тому, что обеспечивает HHVM от Facebook.

Зью Сураски (Zeev Suraski) из Zend написал в которой он открыто признаёт, что они приняли HHVM как конкурента Zend Engine (основан на PHP). Это просто подтверждает, что выпуск HHVM, а затем и Facebook Hack стали причиной огромного интереса Zend к продолжению сохранения лидирующего воплощения PHP.

В этой статье он также демонстрирует как далеко ветка PHPNG эволюционировала в плане улучшения производительности.

2. Движок JIT

Согласно Дмитрию Стогову (Dmitry Stogov) из Zend, разработка PHPNG была начата с мотивации исследовать внедрение движка JIT для Zend Engine, основанного на PHP

Движок JIT может динамически компилировать коды операции (опкоды) в родной машинный код, что в конце-концов сделает код работающим быстрее в следующий раз, когда он будет исполняться.

Хотя внедрение движка JIT ещё не осуществлено в ветку PHPNG, Дмитрий упоминает в мае, что он «потратил значительное количество времени на эксперименты со JIT, и даже создал PoC (Proof of concept — прототип) LLVM , базирующийся на JIT компиляторе встроенном в OPCache».

Следовательно, это определённо в планах Zend разрешить приведение движка JIT в PHP 7, так согласно Зью Сураски (Zeev Suraski) «это может пробить уже достигнутый потолок производительности для и без того сверх быстрой реализации».

3. AST: Abstract Syntax Tree (Дерево абстрактного Синтаксиса)

Это, кажется, является необходимым шагом для реализации цикла события. Цикл события — это часть кода, которая заботиться о перехвате событий связанных с операциями I/O (ввода-вывода) и другими асинхронными задачами, которые могут быть запущены параллельно, как доступ к файлам, сети, базам данных, таймерам и т.д.

Простыми словами, это позволит будущим версиям PHP просто внедрить поддержку выполнения параллельных задач внутри одного запроса, таким образом, сделает прорыв в потенциале улучшения производительности PHP на полностью новый уровень.

Конечно, вы не получите автоматического прироста производительности простым включением поддержки асинхронного программирования. Новый PHP код должен быть написан так, чтобы использовать преимущества потенциала асинхронного программирования.

Не смотря на первоначальные усилия Джина Поля, это не означает, что поддержка встроенного асинхронного программирования будет задействована в PHP 7.

Тем не менее, поскольку Facebook Hack уже обеспечивает поддержку асинхронного программирования очень элегантным образом, я не удивлюсь, если разработчики ядра PHP начнут двигаться быстрее в стороны создания асинхронного программирования в PHP, и оно станет доступным рано или поздно.

5. Автономный многопоточный веб-сервер

Это то, что, кажется, не входит в планы по PHP 7, но это то, что может сделать PHP более масштабируемым.

PHP уже может быть запущен в рабочем режиме на мультипоточных веб-серверах вроде ngynx, lighttpd или даже Apache, тем не менее, это не то же самое, что иметь запущенный PHP на своём собственном мультипоточном веб-сервере.

Мультипоточный веб-сервер может обрабатывать много одновременных запросов, используя единый пул памяти, следовательно, избегается напрасная трата памяти, которая происходит когда PHP запущен как FastCGI или в режиме Apache pre-fork .

Он также позволил бы PHP использовать единый пул соединений к базе данных, минимизируя число одновременных открытых соединений к базе данных во время пика доступа.

HHVM уже может быть запущен как автономный многопоточный веб-сервер с тех дней, когда проект стал называться HipHop PHP compiler.

Это позволяет Facebook несколько уменьшить количество необходимых серверных машин для работы с высокой нагрузкой доступа, которую они имеют.

К сожалению запуск PHP как автономного мультипотокового веб-сервера ещё не входит в планы по PHP 7, несомненно здорово будет иметь эту вещь, по крайней мере, в PHP 8.

Когда будет день релиза PHP 7?

Сейчас слишком рано, чтобы делать реальные предположения о дате выхода PHP 7. Разные люди предполагают, что это будет между 1 и 3 годами. Обосновано предположение ждать финальный релиз PHP 7 где-то в 2016, хотя это не невозможно увидеть ранние альфа версии ещё в 2015.

Т.е. самое раннее через год можно будет попробовать PHP 7.

Заключение

Последние изменения в языке PHP стали, конечно, волнующими.

Если честно признаться, то большинство из этих нововведений стали следствием движения Facebook в сторону HHVM и языка программирования Hack. Я думаю, все мы должны поблагодарить Facebook за такой толчок.

Я подозреваю, что они сделали это нарочно, я имею ввиду продвинули HHVM и Hack, чтобы ключевые разработчики PHP проснулись и двигались быстрее. Если это так, то это сработало! Тем не менее, это принесло пользу для всего PHP сообщества в целом, следовательно, не должно быть недовольных.

Что вы думаете? Вам нравятся эти последние развития в языке PHP? Чтобы ещё вам хотелось увидеть в языке PHP в будущем? Пишите комментарий, чтобы рассказать что вы думаете.

Здравствуйте!

3 декабря был релиз PHP 7. Мы перевели для вас описание новинок со страницы документации http://php.net/manual/en/migration70.new-features.php . Это первая часть.

Объявление скалярных типов

Теперь используются два режима преобразования типов: неявное преобразование (coercive) и явное (strict).

Для параметров доступны типы:

  • строки (string),
  • целые числа (int),
  • числа с плавающей запятой (float),
  • булевы переменные (bool).

Это дополняет набор типов данных в PHP 5: имена классов, интерфейсы, массивы (array) и callable .

Результат:

Для включения режима строгой типизации используйте директиву declare в начале файла:

Declare(strict_types=1)

Режим типизации применяется к конкретному файлу. Включение строгой типизации влияет на вывод скалярных значений, возвращаемых значений, встроенных функции PHP и функций расширений.

Определение типов возвращаемых значений

В PHP 7 появилась возможность объявлять тип возвращаемого значения. Это напрямую коррелирует с новым режимом типизации: при строгой типизации возвращаемые значения должны строго соответствовать заданному типу, иначе будет выброшено исключение TypeError .

Набор типов возвращаемых значений такой же, как для аргументов.

Результат:

Array ( => 6 => 15 => 24)

Оператор объединения со значением NULL

Оператор объединения со значением NULL (??) введен для улучшения читаемости кода в случае, когда обычно используется тернарный оператор и isset() . Оператор возвращает первый операнд, если аргумент определен и не равен NULL и второй операнд в любых других случаях.

Оператор «космический корабль»

Сравнивает два выражения, возвращая -1, 0 и 1, когда первый аргумент меньше, равен или больше второго соответственно. Сравнение производится с помощью обычных правил сравнения типов PHP.

1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 //С плавающей точкой (float) echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 //Строки echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1 ?>

Определение константных массивов define()

Константные массивы могут быть объявлены с помощью define() . В PHP 5.6 они могли быть определены только с помощью директивы const.

Анонимные классы

Поддержка объявления анонимных классов с помощью new class . Это можно использовать для объявления одноразовых объектов без написания целого класса.

logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { echo $msg; } }); var_dump($app->getLogger()); ?>

Результат:

Object(class@anonymous)#2 (0) {}

Escape-последовательности юникод-символов

Юникод-символы задаются шестнадцатеричным кодом в строке с двойными кавычками или herdoc-определении. Допускается добавление одной или нескольких цифр «0» перед кодом символа.

Echo "\u{aa}"; echo "\u{0000aa}"; echo "\u{9999}";

Результат:

ª ª //same as before but with optional leading 0"s 香

Closure::call()

Метод Closure::call() — более производительный способ временной привязки контекста объекта к замыканию и его вызова.

x;}; $getX = $getXCB->bindTo(new A, "A"); // промежуточное закрытие echo $getX(); //Код PHP 7+ $getX = function() {return $this->x;}; echo $getX->call(new A);

Результат:

Остальные нововведения — во второй части. Stay tuned.

Переходить на php 7.0 или подождать? Вот и мы так долго думали, взвешивали, прикидывали. Однако вчера настал тот момент, когда нужно было быстро принять решение

Случилось то, чего не желает себе ни один веб-мастер, ни один сисадмин хайлоада. Портал стал тормозить от нагрузки. Приходящие посетители оплатившие доступ к закрытым материалам и просто посетители, идущая одновременно рассылка 100К+ подписчикам портала, хелпдеск не имеющий возможности адекватно работать с админкой и оказывать помощь людям

В результате вечером был совершен переход с php 5.6 на php 7.0

Краткие характеристики сервера

  • ОС: FreeBSD
  • RAM: 5Гб
  • CPU: Xeon E5335 2.00GHz * 4 (ядра)

Поскольку это FreeBSD и держать одновременно более одной версии php не представляется возможным (на самом деле можно, но с этим придется попариться), даунтайм был всего 40 минут, которые потребовались на снос php 5.6 и установку php 7.0

Кстати у нас есть еще сервер на Gentoo, которая предоставляет возможность . На данный момент там php 5.6, 7.0, 7.1. Но это к слову

И вот, что у нас получилось. Посмотрим на дневные графики, где в левой части день вчерашний, а справа день сегодняшний

Что не изменилось

Что изменилось

С какими мы столкнулись трудностями

  • В текущем php 7.0 нет модуля memcache. Пришлось скачивать сторонний порт
  • Нет модуля mysql. К этому нужно быть готовым и заранее предусмотреть в плане перехода переход на mysqli. Более-менее современные фреймворки поддерживают mysqli
  • Если используете pecl-pdflib, будте готовы к тому, что работать он не будет. Мы используем wkhtmltopdf
  • Часть портала использовала mpdf. Он не работает с php 7.0. Установили свежий при помощи composer
  • Провели легкий рефакторинг кода

Вывод

При том же количестве посетителей портала нагрузка на сервер упала в два раза

Александр Черных

системный администратор

С каждой новой версией PHP разработчики делали немало для повышения производительности. В свое время, большой прирост скорости владельцы сайтов получили при переходе с PHP 5.6 на PHP 7.0, что повысило производительность сайта в 2-3 раза. Поэтому, если вы еще не перешли на PHP 7.x, то самое время это сделать сейчас.

Также заметный рост производительности случился и с обновлением PHP 7.0 до версии 7.1. Положительная тенденция не стала исключением и для PHP 7.2. Прежде всего, оптимизации подвергся встроенный механизм кэширование - Opcache, который является самым эффективным и интегрирован начиная с версии PHP 5.5.

В Opcache была добавлена глобальная оптимизация на основе анализа потока данных с использованием SSA (Static single assignment form): Sparse Conditional Constant Propagation (SCCP), удаление мертвого кода (Dead Code Elimination — DCE) и удаление неиспользуемых локальных переменных, что в теории должно улучшить производительность web-приложений.

Сравнение производительности PHP 5.6, PHP 7.0, PHP 7.1 и PHP 7.2

В связи с тем, что подавляющая часть сайтов не поддерживает PHP 7.2 тестирование проводилось с помощью бенчмарка bench.php.

Тестовая платформа: VPS с одним виртуальным ядром, 2,4 ГГц, 2 Гб памяти и SSD drives. На всех версиях PHP включен Opcache.

По результатам тестирования заметен высокий прирост производительности в PHP 7.2, даже по сравнению с PHP 7.1. И девятикратное превосходство с PHP 5.6. Осталось только дождаться поддержки новой версии PHP со стороны разработчиков CMS, чтобы повторить тесты на реальных web-приложениях.

Основные нововведения

PHP 7.2 включает в себя некоторые улучшения, а также новые возможности:

  • Изменения в преобразовании массивов/объектов, числовые ключи
  • Изменения в подсчете несчитаемых типов
  • Объявление объектного типа
  • HashContext в виде объекта
  • Добавлен алгоритм Argon2 в функции хэширования паролей
  • Улучшения SSL / TLS Констант
  • Удалено расширение Mcrypt
  • Добавлено расширение sodium

Устаревшие функции PHP 7.2

  • __autoload
  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • (unset) cast
  • parse_str() без второго аргумента
  • gmp_random()
  • each()
  • assert() со строковым аргументом
  • $errcontext аргумент обработчика ошибок

Выводы

PHP 7.2 содержит ряд эволюционных изменений, которые положительно скажутся web-приложениях. Заметный прирост скорости в синтетических тестах позволяет надеяться, что удастся улучшить производительность на реальных сайтах. Ждем поддержки PHP 7.2 в будущих обновлениях CMS.

В ближайшее время мы планируем внедрение новой версии PHP 7.2 на всех тарифных планах нашего хостинга.

Веб-разработка - это одно из самых главных направлений в программировании. И каждый разработчик, который работает в этой сфере и считает себя настоящим программистом, знаком с таким языком, как PHP. Данный язык программирования уже очень давно и успешно применяется во всем мире для разработки сайтов и веб-приложений. И если раньше разработка велась на пятой версии языка, то теперь все переходят на PHP 7. Дата выхода новой версии - 11 июня 2015 года. Стоит отметить, что это только альфа-версия. Финальная запланирована на конец 2015 года.

Нововведения

Итак, что же нового появится в свежей версии языка? Разработчики внесли следующие изменения и добавления:

  • Производительность PHP 7 увеличена в два раза в сравнении с прошлыми версиями.
  • Будет поддерживаться 64-битная архитектура.
  • Большое число фатальных ошибок превратились в исключения.
  • Появился комбинированные оператор для сравнения значений.
  • Поддерживается сокращенная конструкция use.
  • Добавлен оператор, который проверяет переменную на ее существование и возвращает значение.
  • Стало возможным указывать массивы в качестве значений констант, которые объявляется при помощи define.
  • Синтаксис конструкторов из четвертой версии теперь является устаревшим.
  • В PHP 7 добавлены анонимные классы.

Почему после PHP 5 не было PHP 6?

Для многих это загадка. На самом деле все просто. Выпуск «шестерки» попросту не состоялся. Главной ее особенностью была поддержка символов "Юникод", так как в веб-разработке без этого никуда.

Идея заключалась в реализации этой поддержки в самом ядре PHP 7. Что нового бы это дало? Расширение возможностей языка, конечно. Стало бы возможным использование смайлов в качестве идентификаторов, а также расширилась бы функциональность строк на различных языках.

Эти планы были амбициозными, но имелось большое число проблем. Было очень непросто и утомительно портировать огромную часть кода для того, чтобы поддерживать "Юникод". Это повлияло на разработку других возможностей и расстроило веб-разработчиков. Так, со временем интерес к поддержке "Юникода" начал падать, а шестая версия перестала разрабатываться.

Но все это уже стало историей, так как вышла версия PHP 7. Что нового в ней?

Улучшение производительности

Раньше все обновления улучшали производительность незначительно, и для разработчиков главной целью был значительный ее сдвиг в PHP 7 в лучшую сторону. Они смогли с этим справиться. Теперь интерес программистов к движку Zend, на котором основан язык PHP, возрос в несколько раз. Многие специалисты отметили, что новая версия значительно эволюционировала и стала конкурентоспособной. Ведь лидерство стали завоевывать другие программирования.

Движок Just In Time

Разработка PHP 7 началась с исследования, позволяющего узнать больше о внедрении данного движка, который способен компилировать код в машинный динамически. Ведь это позволяет в несколько раз увеличить быстродействие кода во время его исполнения. Хотя полностью внедрение еще не произошло, но создатели активно экспериментируют с этим. Если у них получится внедрить в язык JIT-движок, то это позволит поднять предельный уровень производительности еще выше.

Дерево абстрактного синтаксиса

Данный шаг компиляции был предложен российским программистом. Дерево способно обеспечить несколько преимуществ, в числе которых - большой потенциал для будущей оптимизации и более эффективное распределение памяти, что позволит ускорить работу PHP 7. Так, были описаны возможности открытия дерева в пользовательских приложениях. Это может привести к появлению качественных инструментов, которые станут крайне полезными при нахождении ошибок. Тесты, которые выполнялись на настоящих приложениях, показали, что новая версия использует вдвое меньше памяти в моменты обработки запросов. Несмотря на то что все в новой версии выглядит довольно знакомо, она сильно отличается от предыдущей в плане производительности. Ведь тот факт, что потребляется меньше памяти, дает возможность маломощным машинам обрабатывать запросы быстрее. А это способствует выстраиванию вокруг PHP своеобразных микросервисов.

Асинхронное программирование

В PHP 7 это необходимый шаг для того, чтобы реализовать цикл события. Это та часть кода, которая обеспечивает перехват событий, связанных с вводом и выводом, а также другими задачами асинхронного типа, которые могут работать параллельно (доступ к сети, файлам, базам данных).

Если говорить проще, это даст возможность добавить поддержку выполнения таких задач внутри единственного запроса. также позволит в несколько раз увеличить производительность.

Улучшенный синтаксис

PHP 7 - скриптовый язык общего назначения. И для написания этих скриптов был улучшен синтаксис. Теперь код стало легче писать, он выглядит более приятно для разработчиков. Что было изменено?

  • Появилась возможность группировать объявления импорта тех классов, которые находятся в одной строке и в едином пространстве имен. Это помогает сэкономить несколько байт в коде.
  • Добавление Null-коалесцентного оператора решает проблему, возникающую тогда, когда программист хочет присвоить переменной значение, уже присвоенное другой переменной.
  • Комбинированный оператор сравнения, который называют «космическим кораблем», помогает производить трехуровневое сравнение пары значений. Он позволяет понять не только равенство этих значений или их неравенство, но также то, какое из значений больше, если они не равны.

Исключения

Если раньше фатальные ошибки приводили к полной остановке выполняемого сценария, то с появлением исключений они перехватываются и обрабатываются. Теперь такие ошибки, как вызов несуществующей функции, не остановят сценарий. Сгенерируется исключение, которое возможно обработать в отдельном блоке кода. Это важная особенность для серверов, так как фатальные ошибки могут приводить к необходимости перезагрузки, что сильно тормозило работу.

Как установить PHP 7

1. Необходимо загрузить последнюю версию с официального сайта.

2. Из архива извлекается содержимое в папку php. Никакой инсталляции не требуется.

3. Изменяется конфигурационный файл сервера (имеется в виду Apache).

4. Параметр DirectoryIndex должен быть изменен на index.html.

5. Сервер перезагружается, а затем нужно через браузер зайти на страницу index.php и убедиться, что все работает так, как нужно.

В принципе, процесс не слишком изменился в сравнении с прошлой версией. 7 в Linux несколько отличается, так как нужно загружать из репозиториев пакеты, а затем при помощи специальных команд производить инсталляцию.

Заключение

Конечно, все последние изменения в языке программирования PHP стали существенными. Большинство из них были сделаны из-за конкуренции с Facebook и ее языком программирования Hack, который начал перехватывать лидерство. Именно это дало толчок к развитию. За это можно поблагодарить Марка Цукерберга и его компанию. Ведь это принесло большую пользу сообществу PHP-разработчиков. Теперь веб-разработка вышла на качественно новый уровень. Производительность была увеличена и еще будет расти, а следовательно, конкуренция с другими скриптовыми языками программирования пока будет выдержана. Ведь им еще предстоит длинный путь, чтобы сдвинуть со своего места гиганта PHP.