Конкурентный запуск php 3 и php 4


Содержание

Запуск двух версий PHP на одном сервере

У меня есть два проекта на локальном сервере, один проект работает на PHP5.6, а другой — на PHP7.0. Теперь можно ли будет включить эти две версии на основе проектов? Я уже пытался добавить AddHandler application/x-httpd-php7.php в один из проектов htaccess, но он не работает. В настоящее время на сервере уже установлены PHP7.0 и PHP5.6-fpm. Ниже приведен скриншот phpinfo.

Так что после поиска в гугле на весь день. Мне удалось запустить два моих проекта в FastCgi на разных версиях php. Спасибо ребятам с этого форума. Я удалил все, включая Apache и начать все заново. Ниже приведены шаги, которые я использовал для включения двух версий PHP на моем локальном сервере. Кстати, мой компьютер работает на Linux Mint 18.

Предполагая, что вы уже установили Apache, создали виртуальный хост для двух проектов и добавили необходимые php PPA. Позвольте назвать проекты site56.local для PHP 5.6 и site70.local для PHP 7.0. Установите php5.6-fpm и php7.0-fpm , выполнив:

Создайте два файла в /usr/lib/cgi-bin/ (честно говоря, я не знаю, нужен ли этот шаг по-прежнему) и сохраните:

Откройте файл php56 conf /etc/apache2/conf-available/php5.6-fpm.conf , добавьте этот /etc/apache2/conf-available/php5.6-fpm.conf и сохраните:

Теперь включите новую конфигурацию apache:

Если вы установили php5.6 и php5.7, убедитесь, что вы отключили эти два и перезапустите apache:

Создайте файл .htacces в проекте, который должен работать на php7.0, и добавьте этот обработчик:

Теперь создайте файл phpinfo для двух проектов, и если вы видите что-то подобное, то поздравляю!

Установка PHP4 и PHP5 одновременно на один Apache2.2

Часто возникает задача, когда требуется протестировать работу сайтов одновременно в двух версиях PHP: четвертой и пятой. Для этого многие использовали хитроумные способы, вроде установки двух Apache 1.3 и 2.2, где под Apache 1.3 крутился PHP4, а под Apache 2.2 – PHP5. Но Apache 1.3 уже давно устарел и не поддерживается, поэтому резонно использовать последнюю стабильную версию Apache из ветки 2.2. В данной статье я расскажу, как заставить работать на одной машине несколько экземпляров Apache 2.2 с целью запуска PHP различных версий.

Рассмотрим поэтапно процедуры, которые необходимо проделать:

1) Скачать последнюю версию Apache 2.2 (http://httpd.apache.org/download.cgi)

2) Установить на сервер в директорию D:\Apache2.2 (для примера)

3) Убедиться в том, что Apache корректно работает, проверить его запуск/останов в менеджере сервисов

4) Удалить текущий сервис Apache2.2, который установился по умолчанию:

Удаление необходимо для того, чтобы можно было в будущем легко идентифицировать, какой экземпляр Apache относится к PHP4, а какой к PHP5. По умолчанию в сервисах будет безликий Apache2.2

5) Создать заготовки конфигурационных файлов для будущих экземпляров сервисов Apache: httpd_php4.conf и httpd_php5.conf

6) Запустить командную строку с правами администратора. Для этого создать ярлык с командой cmd, нажать на него правой кнопкой мыши и выбрать «Запуск от имени администратора». Иначе не хватит привилегий для создания новых сервисов.

7) Установить новые экземпляры сервисов. Дадим имена новым сервисам PHP4 и PHP5:

8) В менеджере сервисов убедиться, что появились новые сервисы PHP4 и PHP5

9) Убедиться, что конфигурационные файлы разных экземпляров используют различные порты. Стараться не занимать системные порты (81,82 и прочие с коротким номером). В httpd_php4.conf прописать Listen 127.0.0.1:20082, в httpd_php5.conf прописать Listen 127.0.0.1:20081

10) Запустить сервисы PHP4 и PHP5, убедиться в их работоспособности

11) Скачать и установить версии PHP в папки соответственно D:\PHP4 и D:\PHP5

12) Для PHP4 скачать дополнительно файл php4apache2_2.dll, так как он не входит в стандартную поставку. Скопировать его в D:\PHP4

13) Добавить в PATH строку D:\PHP5\;D:\PHP4\;

14) Подключить модули PHP в конфигурационных файлах

apache — запуск двух версий PHP на одном сервере

У меня есть два проекта на локальном сервере, один проект работает на PHP5.6, а другой — на PHP7.0. Теперь можно ли будет включить эти две версии на основе проектов? Я уже пробовал добавлять AddHandler application/x-httpd-php7 .php в одном из проектов htaccess, но не работает. В настоящее время на сервере уже установлены PHP7.0 и PHP5.6-fpm. Ниже скриншот phpinfo.

Решение

Так что после поиска в гугле на весь день. Мне удалось запустить два моих проекта в FastCgi на разных версиях PHP. Спасибо ребятам из этого Форум . Я удалил все, включая Apache и начать все заново. Ниже приведены шаги, которые я использовал для включения двух версий PHP на моем локальном сервере. Кстати, мой компьютер работает на Linux Mint 18.

  1. Предполагая, что вы уже установили Apache, создали виртуальный хост для двух проектов и добавили необходимые php PPA. Давайте назовем проекты site56.local для php5.6 и site70.local для php7.0. Установите php5.6-fpm и php7.0-fpm, запустив.

sudo apt-get установить php7.0-fpm

  1. Создайте два файла в / usr / lib / cgi-bin / (честно говоря, я не знаю, нужен ли этот шаг по-прежнему) и сохраните.

sudo nano / usr / lib / cgi-bin / php56-fcgi

sudo nano / usr / lib / cgi-bin / php70-fcgi

Откройте файл php56 conf «/etc/apache2/conf-available/php5.6-fpm.conf», добавьте этот конфиг и сохраните.

AddHandler php56-fcgi .php
Action php56-fcgi /php56-fcgi
Alias /php56-fcgi /usr/lib/cgi-bin/php56-fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization
Action php70-fcgi /php70-fcgi
Alias /php70-fcgi /usr/lib/cgi-bin/php70-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization

Require all granted

Теперь включите новую конфигурацию apache.

  1. Если вы установили php5.6 и php5.7, убедитесь, что вы отключили эти два и перезапустите apache.

sudo systemctl перезапустить apache2

  1. Создайте файл .htacces в проекте, который должен работать на php7.0, и добавьте этот обработчик.
  1. Теперь создайте файл phpinfo для двух проектов, и если вы видите что-то подобное, то поздравляю!

PS: убедитесь, что вы включили htaccess в вашем apache2.conf или httpd.conf

Другие решения

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

# ls -la / etc / apache2 / conf-enabled | grep php

# ls -la / etc / apache2 / mods-enabled | grep php

Настройте другую версию PHP-FPM для конкретного сайта:

Добавьте следующую строку в существующий файл VirtualHost.

Это не работает для Debian 9 Stretch. Мне понадобилось время, чтобы понять, что делать, но в конце концов я нашел решение, которое кажется еще проще:

Если вы установили php5.6 и php5.7, убедитесь, что вы отключили эти два и перезапустите apache.

На данный момент все ваши сайты должны работать на PHP 5.6.

Для сайтов, которым нужен php 7, добавьте эту строку в vhost:

Это должно сделать свое дело ��

Я попытался реализовать решение Makubex, и оно сработало. У меня была только одна проблема с недавно установленной LAMP, и это было то, что fastcgi не был включен.
Я просто снова установил php с помощью следующего скрипта и впоследствии включил fastcgi.

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

Добавив следующую строку

в конфигурации Apache vhost вы можете изменить версию php внутри каталога php70project в вашем корневом каталоге vhost / var / www на версию 7, работающую от имени fastcgi.

Следующий подход для использования с сокетом Unix

не работает, как задумано.
К сожалению, я не смог найти правильный код, чтобы это работало, но на этой странице нет примера использования сокетов Unix с подпапками. https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html это может быть просто невозможно.

Это можно сделать, отключив и включив новую версию PHP-

  • переключиться на старую версию —
    a2dismod php7.0
    перезапуск службы apache2
  • перейти на более новую версию
    a2enmod php7.0
    перезапуск службы apache2

continue

(PHP 4, PHP 5, PHP 7)

continue используется внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации.

Замечание: Заметим, что в PHP структура switch считается циклической, и внутри нее может использоваться continue.

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

while (list( $key , $value ) = each ( $arr )) <
if (!( $key % 2 )) < // пропуск нечетных чисел
continue;
>
do_something_odd ( $value );
>

$i = 0 ;
while ( $i ++ 5 ) <
echo «Снаружи
\n» ;
while ( 1 ) <
echo «В середине
\n» ;
while ( 1 ) <
echo «Внутри
\n» ;
continue 3 ;
>
echo «Это никогда не будет выведено.
\n» ;
>
echo «Это тоже.
\n» ;
>
?>

Пропуск точки запятой после continue может привести к путанице. Пример как не надо делать.

Ожидается, что результат будет такой:

Но, в PHP до версии 5.4.0, этот скрипт выведет следующее:

Потому что выражение continue print «$i\n»; воспринимается как единое выражение, и print вызывается только тогда, когда выражение $i == 2 истинно. (Возвращаемое значение от print передается к continue как числовой аргумент.)

Начиная с PHP 5.4.0, вышеприведенный пример вызовет ошибку E_COMPILE_ERROR .

Ловим попутный ветер или как запустить скрипт PHP

Дата публикации: 2020-09-19

От автора: Если вы когда-нибудь запускали воздушного змея, то знаете, что это не так просто, хотя со стороны кажется наоборот. На самом деле нужно приловчиться, чтобы вовремя веревку натянуть или поймать воздушную «волну». Сегодня я расскажу, как запустить скрипт PHP и какие «веревочки» дергать, чтобы он не просто работал, а «летал»!

Особенности запуска

Как уже не раз упоминалось, PHP – это серверный язык программирования, поэтому сделать так, чтобы результат работы его кода отобразился в браузере, будет немного сложнее. Для этого файл должен располагаться непосредственно на серверном пространстве. Для работы с PHP используются два типа сервера:

Обычный (удаленный) –предоставляется хостером.

Локальный – устанавливается на клиентской машине.

На стороне хостинга, чтобы увидеть результат работы скрипта, в строку браузера вводится адрес следующего формата: ваш_сайт.ru/имя_файла.php

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

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

Запуск скрипта в Denwer

В «апачевских» сборках все скрипты запускаются в localhost. Чтобы продемонстрировать это на практике, создадим какой-нибудь интересный пример. Вот его код:

Разместите этот код в файле PHP и сохраните его на виртуальном диске, который создается после запуска локального сервера. У меня это файл test2.php.

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

Теперь разберемся, как запустить PHP скрипт на компьютере. Для этого в браузере следует указать адрес в формате: localhost/имя_файла.php

Начинаем мучиться

Может, слишком и унылое название для раздела, но я немного намучился, пока получилось открыть файл PHP через командную строку. При попытке запуска система ПК выдавала вот такого рода ошибки:

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Это странно, поскольку упоминаемые библиотеки у меня присутствовали в папке ext. Оказывается, что все дело в неправильно прописанных путях в конфигурационном файле php.ini.

В нем нужно найти раздел «Paths and Directories» и исправить путь, указанный в параметре extension_dir. Измените правые слэши на левосторонние и добавьте в начале адреса букву виртуального диска.

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

Если все хорошо

В командной строке системе нужно указать путь, где находится «экзешник» интерпретатора языка PHP. В Денвере он находится по этому пути: Z:\usr\local\php5

Здесь же расположен и глобальный файл конфигурации.

Запускаем командную строку Винды. Затем указываем системе путь к исполняемому файлу PHP. После чего задаем путь к нужному скрипту: Z:\usr\local\php5\php.exe Z:\home\localhost\www\test2.php

Но в итоге вы получите не совсем ожидаемый результат:

И все потому, что командная строка «не понимает» теги HTML. Перед тем, как запустить PHP скрипт из командной строки, немного модифицируем код, чтобы он возвращал нам только текущее время без эффекта «часов».

Как на Apache с PHP 7 запустить версию PHP 5.3

Есть локальный сервер на Apache с PHP версии 7 но в списке сайтов есть некоторые написаные с версией 5.3 и из за того что некоторый функционал не работает в особенности mysql_connect и все подобные без PDO с этими сайтами невозможно работать как то можно сделать чтобы работало с прежними версиями без отката всего веб сервера?

2 ответа 2

Конкретно к этому Апачу вы уже не прикрутите параллельно php другой версии в качестве модуля Апача.

Единственный вариант, который я вижу, это использовать php-as-cgi для сайтов, которым нужна старая версия php. Т.е. надо будет установить на сервер php 5.3 (не сломав при этом 7-ю версию), потом переконфигурить виртуалхосты (которым нужна версия 5.3), чтобы php для них был в качестве cgi.

В качестве одного из возможных вариантов. Разместить нужную версию PHP в cgi-bin , и направить на неё Apache при помощи .htaccess .

ИМХО, и быстро и просто.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php apache или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.12.35408

Производительность PHP 5.6, PHP 7.0, PHP 7.1, PHP 7.2 и PHP 7.3 в тестах и сравнениях (2020)

Каждый год хостинговая платформа Kinsta публикует подробные тесты производительности PHP на разных платформах. На этот раз они протестировали пять различных версий PHP на 24 различных платформах / конфигурациях; включая WordPress (4.9 и 5.0), Drupal, Joomla, Laravel, Symfony и многие другие. Они также протестировали популярные решения для электронной коммерции, такие как WooCommerce, Easy Digital Downloads, Magento, Grav CMS и October CMS.

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

2020 — год PHP

PHP — это серверный язык скриптов и программирования с открытым исходным кодом, который в основном используется для веб-разработки. Основная часть программного обеспечения WordPress написана на PHP, что делает PHP очень важным языком для сообщества WordPress. Хотя и новый редактор блоков Gutenberg в WordPress 5.0 больше использует JavaScript с React.

Согласно W3Techs, PHP используют более 78% всех веб-сайтов , использующих язык программирования на стороне сервера.

В тестах 2020 года HHVM был явным победителем с точки зрения производительности WordPress. HHVM был создан командой из Facebook. Это система, использующая JIT-компиляцию для преобразования PHP-кода в машинный язык для установления связи между PHP-кодом и железом, на котором он выполняется.

Однако в тестах в 2020 году PHP 7.2 занял первое место почти на всех платформах, впервые обойдя HHVM (чем больше запросов, тем лучше):

  • WordPress 4.9.4 PHP 7.2 : 148.80 запросов / сек
  • WordPress 4.9.4 HHVM: 144,76 запросов / сек
  • WordPress 4.9.4 + WooCommerce 3.3.1 PHP 7.2: 92.60 запросов / сек ��
  • WordPress 4.9.4 + WooCommerce 3.3.1 HHVM: 69.58 запросов / сек

Поэтому с 28 августа 2020 года Kinsta прекратила предлагать HHVM. Во-первых, потому что это больше не стабильный вариант для WordPress, а во-вторых, потому что он больше не поддерживает PHP с версии 3.30.

Ниже вы увидите, как работает новейшая версия PHP 7.3 (выпущенная 6 декабря 2020 года), а также WordPress 5.0 (также выпущенная 6 декабря 2020 года).

Тесты PHP (2020)

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

  • Используемая машина: 8x Intel(R) Xeon(R) CPU @ 2.20GHz (работает на облачной платформе Google в изолированном контейнере)
  • ОС: Ubuntu 18.04.1 LTS
  • Docker: Debian 9, Nginx 1.15.7, MariaDB 10.3.11
  • Версия PHP: 5.6, 7.0, 7.1, 7.2, 7.3
  • Кэширование страниц: отключено на всех конфигурациях и платформах.
  • OPCache: для WordPress, Joomla и Drupal использовали официальный образ Docker и создали свой собственный для PHP 7.3 ( Dockerfile ). В остальном использовали тот же образ с включенным OPcache, используя следующие рекомендуемые настройки php.ini , за исключением opcache.max_accelerated_files значения, которое было увеличено с 4000 до 50000.

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

Протестированные платформы и конфигурации

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

В связи с тем, что демонстрационный контент на каждой платформе может сильно различаться, было принято решение протестировать производительность свежих установок barebone.

WordPress 5.0

Мы начали с WordPress 5.0, так как это самая интересная сейчас для всех версия. Мы использовали новую тему Twenty Nineteen (1.0) и в течение минуты тестировали сайт с 15 одновременными пользователями.

  • Протестированный URL: / hello-world /
  • Примечание: страница содержит 1 комментарий.
  • Образ Docker из https://hub.docker.com/_/wordpress/, и собственный для PHP 7.3 ( Dockerfile ).

Тест WordPress 5.0 PHP

Результаты тестов

  • WordPress 5.0 PHP 5.6: 91,64 запросов / сек
  • WordPress 5.0 PHP 7.0: 206,71 запросов / сек
  • WordPress 5.0 PHP 7.1: 210,98 запросов / сек
  • WordPress 5.0 PHP 7.2: 229,18 запросов / сек
  • WordPress 5.0 PHP 7.3: 253,20 запросов/ сек��

PHP 7.3 стал победителем, оказавшись быстрее, чем PHP 7.2. И если вы сравните PHP 7.3 с PHP 5.6, он может обрабатывать почти в 3 раза больше запросов в секунду!

WordPress 5.0 + WooCommerce 3.5.2

WooCommerce — это полностью настраиваемая платформа электронной коммерции с открытым исходным кодом, созданная для WordPress. Это также одно из самых популярных решений для электронной коммерции в сообществе WordPress, и в настоящее время оно управляет более чем 14% всех сайтов электронной коммерции в Интернете.

Для следующего теста взяли WordPress вместе с установленной WooCommerce. Мы использовали бесплатную e-commerce тему Storefront (2.4.1).

  • Протестированный URL: / product / woo-logo /
  • Примечание. На странице содержится 3 сопутствующих товара, 1 обзор / комментарий о товаре, 1 товар в разделе «Вам также может понравиться», пагинация.
  • Образ Docker из https://hub.docker.com/_/wordpress/, и собственный для PHP 7.3 ( Dockerfile ).
Илон Маск рекомендует:  background-blend-mode в CSS

Тест PHP WordPress 5.0 + WooCommerce

Результаты тестов

  • WordPress 5.0 + WooCommerce 3.5.2 PHP 5.6: 24,74 запросов / сек
  • WordPress 5.0 + WooCommerce 3.5.2 PHP 7.0: 56,94 запросов / сек
  • WordPress 5.0 + WooCommerce 3.5.2 PHP 7.1: 57,00 запросов / sec
  • WordPress 5.0 + WooCommerce 3.5.2 PHP 7.2: 63.10 запросов / сек.
  • WordPress 5.0 + WooCommerce 3.5.2 PHP 7.3: 68,87 запросов/ сек.

При запуске WooCommerce PHP 7.3 с небольшим отрывом обогнал PHP 7.2.

WordPress 5.0 + Easy Digital Downloads 2.9.9

Easy Digital Downloads (EDD), созданный Pippin Williamson, является бесплатным плагином для электронной коммерции WordPress, который нацелен исключительно на то, чтобы помочь создателям и разработчикам продавать цифровые продукты.

Посмотрев, как работает WooCommerce, мы взяли WordPress и установили Easy Digital Downloads. Мы использовали бесплатную тему EDD Starter (1.0).

  • Протестированный URL: / downloads / sample-product /
  • Примечание. Страница содержит 3 меню в панели навигации и виджет «Добавить в корзину».
  • Образ Docker https://hub.docker.com/_/wordpress/, и свой собственный для PHP 7.3 ( Dockerfile ) /

Тесть PHP WordPress + Easy Digital Downloads

Результаты тестов

  • WordPress 5.0 + EDD 2.9.9 PHP 5.6: 71,74 запросов / сек
  • WordPress 5.0 + EDD 2.9.9 PHP 7.0: 169,11 запросов / сек
  • WordPress 5.0 + EDD 2.9.9 PHP 7.1: 170,08 запросов / сек
  • WordPress 5.0 + EDD 2.9.9 PHP 7.2: 187,78 запросов / сек
  • WordPress 5.0 + EDD 2.9.9 PHP 7.3: 206,88 запросов / сек��

PHP 7.3 доминировал в тестах с WordPress и Easy Digital Downloads. Вы также можете заметить, что EDD может обрабатывать в 3 раза больше запросов в секунду по сравнению с WooCommerce.

WordPress 5.0.2

Поскольку WordPress 5.0.2 был выпущен совсем недавно, мы подумали, что было бы интересно запустить тесты для 5.0.2.

Мы использовали новую тему Twenty Nineteen (1.0) и в течение минуты тестировали сайт с 15 одновременными пользователями.

  • Протестированный URL: / hello-world /
  • Примечание: страница содержит 1 комментарий.
  • Образ Docker из https://hub.docker.com/_/wordpress/, и свой собственный для PHP 7.3 ( Dockerfile ).

Тесть PHP WordPress 5.0.2

Результаты тестов

  • WordPress 5.0.2 PHP 5.6: 88,62 запросов / сек
  • WordPress 5.0.2 PHP 7.0: 205,06 запросов / сек
  • WordPress 5.0.2 PHP 7.1: 207,34 запросов / сек
  • WordPress 5.0.2 PHP 7.2: 219,01 запросов / сек
  • WordPress 5.0.2 PHP 7.3: 241,27 запросов / сек��

PHP 7.3 снова взял золото, но WordPress 5.0.2 оказался немного медленнее, чем версия 5.0.

WordPress 4.9.8

Так как WordPress 5.0 был выпущен совсем недавно, мы подумали, что было бы интересно запустить тесты для 4.9.8, так как многие из вас, вероятно, еще не обновились. Или вам может быть интересно, работает ли WordPress 5.0 быстрее или медленнее.

Мы использовали новую тему Twenty Nineteen (1.0) и в течение минуты тестировали сайт с 15 одновременными пользователями.

  • Протестированный URL: / hello-world /
  • Примечание: страница содержит 1 комментарий.
  • Образ Docker https://hub.docker.com/_/wordpress/, и свой собственный для PHP 7.3 ( Dockerfile )

WordPress 4.9.8 PHP тесты

Вставить на свой сайт:

Результаты тестов

  • WordPress 4.9.8 PHP 5.6: 97,59 запросов / сек
  • WordPress 4.9.8 PHP 7.0: 221,42 запросов / сек
  • WordPress 4.9.8 PHP 7.1: 233,78 запросов / сек
  • WordPress 4.9.8 PHP 7.2: 250,36 запросов / сек
  • WordPress 4.9.8 PHP 7.3: 276,31 запросов / сек.

PHP 7.3 стал победителем, оказавшись быстрее, чем PHP 7.2. И если сравнить PHP 7.3 с PHP 5.6, он может обрабатывать почти в 3 раза больше запросов в секунду!

Однако наиболее интересным результатом является то, что WordPress 4.9.8 работает быстрее, чем WordPress 5.0. Это не сильно удивляет, так как весь проект WordPress 5.0 был выпущен поспешно и не допилен до конца.

WordPress 4.9.8 + WooCommerce 3.5.2

Мы также запустили тесты производительности с WordPress 4.9.8 и WooCommerce 3.5.2.

Для следующего теста мы взяли WordPress с установленной WooCommerce и Storefront (2.4.1).

  • Протестированный URL: / product / woo-logo /
  • Примечание. На странице содержится 3 сопутствующих товара, 1 обзор / комментарий о товаре, 1 товар в разделе «Вам также может понравиться», пагинация.
  • Образ Docker из https://hub.docker.com/_/wordpress/, и свой собственный для PHP 7.3 ( Dockerfile ).

Тесть PHP WordPress 4.9.8 + WooCommerce

Результаты тестов

  • WordPress 4.9.8 + WooCommerce 3.5.2 PHP 5.6 : 26.07 запросов / сек

  • WordPress 4.9.8 + WooCommerce 3.5.2 PHP 7.0: 60,37 запросов / сек
  • WordPress 4.9.8 + WooCommerce 3.5.2 PHP 7.1: 60.36 запросов / sec
  • WordPress 4.9.8 + WooCommerce 3.5.2 PHP 7.2: 63.33 запросов / сек
  • WordPress 4.9.8 + WooCommerce 3.5.2 PHP 7.3: 69,24 запросов / сек ��

PHP 7.3 победил PHP 7.2 с небольшим отрывом. WordPress 4.8.9 с WooCommerce также был немного быстрее, чем при работе с WordPress 5.0.

WordPress 4.9.8 + Easy Digital Downloads 2.9.9

Мы также провели тесты производительности с WordPress 4.9.8 и Easy Digital Downloads 2.9.9.

Мы взяли WordPress вместе с Easy Digital Downloads и использовали бесплатную версию EDD Starter Theme (1.0).

  • Протестированный URL: / downloads / sample-product /
  • Примечание. Страница содержит 3 меню в панели навигации и виджет «Добавить в корзину».
  • Образ Docker с https://hub.docker.com/_/wordpress/, и свой собственный для PHP 7.3 ( Dockerfile ) /

Тесть PHP WordPress 4.9.8 + Easy Digital Downloads

Результаты тестов

  • WordPress 4.9.8 + EDD 2.9.9 PHP 5.6: 80,08 запросов / сек
  • WordPress 4.9.8 + EDD 2.9.9 PHP 7.0: 186,99 запросов / сек
  • WordPress 4.9.8 + EDD 2.9.9 PHP 7.1: 185.40 запросов / сек
  • WordPress 4.9.8 + EDD 2.9.9 PHP 7.2: 192.73 запросов / сек
  • WordPress 4.9.8 + EDD 2.9.9 PHP 7.3: 211,37 запросов / сек��

PHP 7.3 доминировал в тестах с WordPress и Easy Digital Downloads. WordPress 4.9.8 с EDD также был немного быстрее, чем при работе с WordPress 5.0.

Drupal 8.6.4

Drupal — это CMS с открытым исходным кодом, популярная благодаря своей модульной системе и сильному сообществу разработчиков. Первоначально он был запущен в 2000 году и, согласно W3Techs, обеспечивает 1,9% всех веб-сайтов с долей 5,5% на рынке CMS.

Для теста Drupal мы использовали бесплатную тему Bartik (8.6.4).

  • Протестированный URL: / node / 1
  • Примечание. Страница содержит заголовок, абзац и виджет (поиск). Кэширование страниц отключено: https://www.drupal.org/node/2598914
  • Образ Docker с https://hub.docker.com/_/drupal/, и свой собственный для PHP 7.3 ( Dockerfile )

Тесты PHP Drupal

Результаты тестов

  • Drupal 8.6.4 PHP 5.6: 14,19 запросов / сек
  • Drupal 8.6.4 PHP 7.0: 30,30 запросов / сек
  • Drupal 8.6.4 PHP 7.1: 30,42 запросов / сек
  • Drupal 8.6.4 PHP 7.2: 32,59 запросов / сек
  • Drupal 8.6.4 PHP 7.3: 35,90 запросов / сек

При работе с Drupal PHP 7.3 победил PHP 7.2 с небольшим отрывом.

Joomla! 3.9.1

Joomla! это бесплатная CMS с открытым исходным кодом для публикации контента, первоначально выпущенная 17 августа 2005 года. Она построена на основе model–view–controller фреймворка и, согласно W3Techs, используется на 3,0% всех веб-сайтов в Интернете.

Для Joomla использовали бесплатный шаблон Beez3 .

  • Протестированный URL: /index.php/3-welcome-to-your-blog
  • Примечание. Установка в режиме «Блог». Модули, такие как поиск, виджет и крошка, отключены.
  • Образ Docker https://hub.docker.com/_/joomla/, и свой собственный для PHP 7.3 ( Dockerfile )

Тесты PHP Joomla!

Результаты тестов

  • Joomla! 3.9.1 PHP 5.6: 27,45 запросов / сек
  • Joomla! 3.9.1 PHP 7.0: 38,48 запросов / сек
  • Joomla! 3.9.1 PHP 7.1: 37,79 запросов / сек
  • Joomla! 3.9.1 PHP 7.2: 38,68 запросов / сек
  • Joomla! 3.9.1 PHP 7.3: 41,03 запросов / сек.

На Joomla мы видим, что производительность была немного хуже по сравнению с некоторыми другими платформами. Тем не менее, PHP 7.3 все еще был победителем.

Magento 2 (CE) 2.1.15 + 2.3.0

Magento — это популярная платформа электронной коммерции с открытым исходным кодом, написанная на PHP и выпущенная 31 марта 2008 года. Согласно W3Techs, она обеспечивает работу 1,0% всех веб-сайтов в Интернете.

Для теста Magento 2 мы использовали бесплатную тему Luma. Мы использовали две версии из-за того, что 2.1.15 единственная, которая поддерживает PHP 5.6. Для дополнительных тестов мы использовали 2.3.0. Magento 2 пока не поддерживает PHP 7.3 .

  • Протестированный URL: /index.php/lifelong-fitness-iv.html
  • Примечание. Кэширование страниц отключено. Протестированный URL-адрес является отдельным продуктом. Он содержит один продукт изображения, панель навигации, навигацию через хлебные крошки и не содержит обзоров.
  • http://pubfiles.nexcess.net/magento/ce-packages/

PHP тест Magento 2

Результаты тестов

  • Magento 2 (CE) 2.1.15 PHP 5.6: 7,65 запросов / сек
  • PHP 7.0 для Magento 2 (CE) 2.1.15: 16,19 запросов / сек
  • PHP 7.1 для Magento 2 (CE) 2.1.15 : 16,38 запросов / сек ��
  • PHP 7.1 для Magento 2 (CE) 2.3.0: 13,60 запросов / сек
  • Magento 2 (CE) 2.3.0 PHP 7.2: 14,25 запросов / сек
  • Magento 2 (CE) 2.3.0 PHP 7.3: не поддерживается

Фактически, более старая версия, Magento 2 (CE) 2.1.15 вместе с PHP 7.1 была самой быстрой.

Grav CMS 1.5.5

Grav — это простая в использовании, но мощная CMS с открытым исходным кодом, не требующая базы данных, так назыflat-file CMS.

Для тестирования Grav CMS мы использовали бесплатный пакет «Clean Blog» .

  • Протестированный URL: / home / the-urban-jungle
  • Примечание. Контент — это просто запись блога в одном столбце без боковой панели.

Тест PHP Grav CMS

Результаты тестов

  • Grav CMS 1.5.5 PHP 5.6: 42,62 запросов / сек
  • Grav CMS 1.5.5 PHP 7.0: 64,43 запросов / сек.
  • Grav CMS 1.5.5 PHP 7.1: 63,74 запросов / сек.
  • Grav CMS 1.5.5 PHP 7.2: 65,26 запросов / сек.
  • Grav CMS 1.5.5 PHP 7.3: 68,34 запросов / сек ��

С Grav CMS мы видим, что победила последняя версия PHP 7.3.

October CMS 1.0.443

October CMS — это бесплатная модульная CMS с открытым исходным кодом, размещенная на собственной платформе и основанная на Laravel PHP Framework. Была выпущен 15 мая 2014 года.

Для теста October CMS мы использовали бесплатную тему Clean Blog . Важно отметить, что October CMS больше не совместим с PHP 5.6

  • Протестированный URL: / blog / post / first-blog-post

Результаты тестов

  • PHP 5.6 October CMS 1.0.443: не поддерживается
  • PHP 7.0 October CMS 1.0.443: 23,29 запросов в секунду
  • PHP 7.1 October CMS 1.0.443: 22,97 запросов в секунду
  • PHP 7.2 October CMS 1.0.443: 23,38 запросов / сек
  • PHP 7.3 October CMS 1.0.443 : 25.58 запросов / сек ��

PHP 7.3 снова является победителем, хотя бы с небольшим отрывом.

Также приятно видеть, что эти небольшие системы управления контентом отказываются от поддержки старых версий PHP. К сожалению, когда дело доходит до WordPress и других платформ с большой долей рынка, дела идут медленнее из-за проблем совместимости.

Laravel 5.4.36 + 5.7.15

Laravel — это очень популярный PHP-фреймворк с открытым исходным кодом, используемый для разработки веб-приложений. Он был создан Taylor Otwell и выпущен в июне 2011 года.

Для теста Laravel мы использовали простую тему HTML.

  • Протестированный URL: / (homepage)
  • Запись содержит название, имя автора и основное содержание. База данных содержит 1 таблицу «записи».
  • Таблица содержит 6 столбцов «post_title», «post_content», «post_author», «creation_at» и «updated_at».
  • Протестированный URL подключен к базе данных и показывает 1 сообщение из базы данных.

PHP тест Laravel 5.4.36

Результаты тестов

  • Laravel 5.4.36 PHP 5.6: 340,26 запросов / сек
  • Laravel 5.4.36 PHP 7.0: 610,81 запросов / сек
  • Laravel 5.4.36 PHP 7.1: 616,93 запросов / сек
  • Laravel 5.4.36 PHP 7.2: 692,86 запросов / сек
  • Laravel 5.4.36 PHP 7.3: 717,06 запросов / сек��

PHP 7.3 — явный победитель.

Важно отметить, что Laravel 5.7.15 требует PHP 7.1 или выше .

PHP тест Laravel 5.7.15

Результаты тестов

  • Laravel 5.7.15 PHP 5.6: не поддерживается
  • Laravel 5.7.15 PHP 7.0: не поддерживается
  • Laravel 5.7.15 PHP 7.1: 542,16 запросов в секунду
  • Laravel 5.7.15 PHP 7.2: 606.73 запросов в секунду
  • Laravel 5.7.15 PHP 7.3: 621,09 запросов / сек.

Опять же, PHP 7.3 является победителем. Однако, что интересно, Laravel 5.4.36 с PHP 7.3 быстрее, чем Laravel 5.7.15.

Symfony 3.3.6 + 4.2.0

Symfony — это набор повторно используемых PHP-компонентов и PHP-фреймворк для создания веб-приложений, API, микросервисов и веб-сервисов. Выпущена 22 октября 2005 г.

Для теста Symfony мы использовали демо Symfony с MySQL (по умолчанию используется SQLite). Тесты были проведены несколько раз, и были взяты средние значения.

  • Протестированный URL: / en/blog/posts/hello-world
  • Пост содержит заголовок, дату, имя автора, 2 тега и 5 комментариев.
  • Последняя версия может работать только в версии 7.1 и выше. Результат немного медленнее по сравнению с прошлогодним тестом. Возможно, это связано с тем, что на одной странице запрашивается больше таблиц, чем на главной странице (комментарии).

Тест PHP Symfony 3.3.6

Результаты тестов

  • Symfony 3.3.6 PHP 5.6: 71,71 запросов / сек
  • Symfony 3.3.6 PHP 7.0: 155,08 запросов / сек
  • Symfony 3.3.6 PHP 7.1: 158,88 запросов / сек
  • Symfony 3.3.6 PHP 7.2: 169,78запросов / сек
  • Symfony 3.3.6 PHP 7.3: не поддерживается

Поскольку PHP 7.3 не поддерживается Symfony 3.3.6, выигрывает здесь PHP 7.2

Важно отметить, что Symfony 4.2.0 требует PHP 7.1 или выше .

Тест PHP Symfony 4.2.0

Результаты тестов

  • Symfony 4.2.0 PHP 5.6: не поддерживаются
  • Symfony 4.2.0 PHP 7.0: не поддерживается
  • Symfony 4.2.0 PHP 7.1: 123,64 запросов/ сек
  • Symfony 4.2.0 PHP 7.2: 126,76 запросов / сек
  • Symfony 4.2.0 PHP 7.3: 140,09 запросов / сек��

PHP 7.3 снова на вершине.

CodeIgniter 3.1.9

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

  • Протестированный URL: / (homepage)
  • Примечание. Домашняя страница содержит контент (заголовок и основной текст), полученный из таблицы базы данных.

PHP тест CodeIgniter

Результаты тестов

  • CodeIgniter 3.1.9 PHP 5.6: 708,31 запросов / сек
  • CodeIgniter 3.1.9 PHP 7.0: 855,08 запросов / сек
  • CodeIgniter 3.1.9 PHP 7.1: 872,79 запросов / сек
  • CodeIgniter 3.1.9 PHP 7.2: 883,88 запросов / сек
  • CodeIgniter 3.1.9 PHP 7.3: 889,67 запросов / сек��

Как и в случае с Laravel и Symfony, PHP 7.3 был самым быстрым при работе CodeIgniter.

PyroCMS 3.5.3

PyroCMS является расширением Laravel с открытым исходным кодом и позволяет быстрее создавать веб-сайты и приложения на платформе.

Для теста PyroCMS мы использовали бесплатную стартовую тему .

  • Протестированный URL: / posts / welcome-to-pyrocms
  • Примечание: PyroCMS не поддерживает PHP 5.6. Мы также столкнулись с ошибками при запуске, пытаясь запустить его на PHP 7.3, скорее всего, потому что он еще не поддерживается. Поэтому мы не смогли включить PHP 7.3 в тесты.

Тест PHP PyroCMS

Результаты тестов

  • PyroCMS 3.5.3 PHP 5.6: не поддерживаются
  • PyroCMS 3.5.3 PHP 7.0: 33,56 запросов / сек.
  • PyroCMS 3.5.3 PHP 7.1: 34,87 запросов / сек
  • PyroCMS 3.5.3 PHP 7.2:36,12 запросов в секунду ��
  • PyroCMS 3.5.3 PHP 7.3: не поддерживается

Из-за того, что PHP 7.3 еще не работает с PyroCMS, PHP 7.2 выиграл тесты здесь с небольшим отрывом.

Pagekit 1.0.15

Pagekit — это модульная и легкая CMS с открытым исходным кодом, основанная YOOtheme. Была выпущена весной 2020 года.

Для теста Pagekit мы использовали бесплатную тему One ( тема поумолчанию Pagekit).

  • Протестированный URL: / blog / 1

Тесты PHP Pagekit

Результаты тестов

  • Pagekit 1.0.15 PHP 5.6: 133,11 запросов в секунду
  • Pagekit 1.0.15 PHP 7.0: 226,29 запросов / сек
  • Pagekit 1.0.15 PHP 7.1: 227,42 запросов / сек.
  • Pagekit 1.0.15 PHP 7.2: 238,00 запросов / сек
  • Pagekit 1.0.15 PHP 7.3: 244,77 запросов / сек��

PHP 7.3 взял золото при тестировании с Pagekit.

Bolt CMS 3.6.3

Bolt CMS, или Bolt , является инструментом управления контентом с открытым исходным кодом, который стремится быть максимально простым и понятным. Он основан на компонентах Silex и Symfony, использует Twig и SQLite, MySQL или PostgreSQL.

Для теста Bolt CMS мы использовали бесплатную тему Bolt Base 2020 .

  • Протестированный URL: / page / hello-world
  • Примечание. Контент, созданный с помощью встроенного генератора демо контента.

PHP тест Bolt CMS

Результаты тестов

  • Bolt CMS 3.6.3 PHP 5.6: 33,01 запросов / сек
  • Bolt CMS 3.6.3 PHP 7.0: 75,69 запросов / сек
  • Bolt CMS 3.6.3 PHP 7.1: 76,02 запросов / сек
  • Bolt CMS 3.6.3 PHP 7.2: 77,38 запросов / сек
  • Bolt CMS 3.6.3 PHP 7.3: 83,81 запросов / сек ��

PHP 7.3 взял золото при тестировании Bolt CMS.

Anchor CMS 0.12.7

Anchor — это сверхпростая, легкая в использовании система с открытым исходным кодом, созданная для простого создания контента.

Для теста Anchor CMS мы использовали бесплатную тему по умолчанию от Visual Idiot.

  • Протестированный URL: / posts / hello-world

PHP тест Anchor CMS

Результаты тестов

  • Anchor CMS 0.12.7 PHP 5.6: 559,02 запросов / сек
  • Anchor CMS 0.12.7 PHP 7.0: 677,48 запросов / сек
  • Anchor CMS 0.12.7 PHP 7.1: 691,45 запросов / сек
  • Anchor CMS 0.12.7 PHP 7.2: 713,37 запросов / сек
  • Anchor CMS 0.12.7 PHP 7.3: 728,96 запросов / sec ��

PHP 7.3 взял золото при тестировании с Anchor CMS.

Craft CMS 3.0.35

Craft CMS — это система управления контентом для разработчиков, дизайнеров и веб-профессионалов, которая сочетает в себе гибкость, мощность и простоту использования для клиентов.

  • Протестированный URL: / news / hello-world
  • Протестировано демо-приложение с https://github.com/craftcms/demo

Тесты PHP Craft CMS

Результаты тестов

  • CMS 3.0.35 PHP 5.6: не поддерживается
  • Craft CMS 3.0.35 PHP 7.0: 57,46 запросов / сек
  • Craft CMS 3.0.35 PHP 7.1: 58,81 запросов / сек
  • Craft CMS 3.0.35 PHP 7.2: 59,19 запросов в секунду

  • Craft CMS 3.0.35 PHP 7.3: 59,64 запросов / сек

PHP 7.3 взял золото при тестировании с Craft CMS.

ExpressionEngine 5.0.2

ExpressionEngine — это гибкая, многофункциональная платформа управления контентом, которая позволяет сотням тысяч людей и организаций по всему миру легко управлять своим веб-сайтом.

Для теста ExpressionEngine мы использовали тему по умолчанию.

  • Протестированный URL: / blog / entry / super-old-entry
  • Примечание. На странице есть боковая панель с 3 виджетами (поиск, список категорий и ссылка на RSS-канал). На странице также имеется навигационная панель.

PHP тесты ExpressionEngine

Результаты тестов

  • PHP 5.6 ExpressionEngine 5.0.2: не поддерживаются
  • ExpressionEngine 5.0.2 PHP 7.0: 53,50 запросов / сек
  • ExpressionEngine 5.0.2 PHP 7.1: 53,83 запросов / сек.
  • ExpressionEngine 5.0.2 PHP 7.2: 55,23 запросов в секунду
  • ExpressionEngine 5.0.2 PHP 7.3: 56,15 запросов в секунду ��

PHP 7.3 взял золото при тестировании с ExpressionEngine.

Выводы по результатам тестирования

Как видно из приведенных выше тестов, PHP 7.3 лидирует в плане производительности на всех платформах.

  • PHP 7.3 был самым быстрым в 19 из 22 протестированных конфигураций.
  • Что касается WordPress, PHP 7.3 был самым быстрым во всех тестах (стандартный сайт WordPress с 4.9.8 и 5.0, WooCommerce и Easy Digital Downloads).
  • Если ваш хостинг-провайдер не предлагает более новые версии PHP, возможно, пришло время подумать о переезде.
  • Для пользователей WordPress, помимо обновления до последней версии PHP, мы подготовили руководство по ускорению сайта на WordPress.

Развитие синтаксиса PHP — новинки версий 5.3-7.1

В этой статье я рассмотрю интересные моменты в развитии синтаксиса PHP — получится своего рода список изменений PHP. Что появилось в версиях PHP 5.3 и выше. Основная цель этой статьи создать некую карту изменений синтаксиса, что можно было быстро освежить в памяти «фишки» синтаксиса PHP, которые упрощают коддинг. У меня в последнее время частенько возникает необходимость убедиться, что можно в PHP 5.3, а чего нельзя.

При написании плагинов или тем WordPress можно использовать только возможности PHP 5.3, выше пожалуй не стоит. Все что можно в PHP 5.4 и выше, нужно решать через создание вспомогательных переменных. Впрочем, даже 5.3 не всегда работает, есть еще серверы с PHP 5.2, но хорошо что это редкость. К слову, сам WordPress еще поддерживает PHP 5.2.

Итак, к новинкам.

$str1 <0>— синтаксис получения символа строки

Новый синтаксис обращения к символам строки:

$str2[0] не рекомендуется, хотя и работает точно также. Рекомендация использовать фигурные скобки <> связана с тем, чтобы при прочтении кода было сразу понятно, что обрабатывается строка, а не элемент массива. Как мы знаем квадратными скобками в PHP принято обозначать массивы, а не строки.

В PHP 5.3, как и во всей пятой ветке PHP, включена новая машина-интерпретатор скриптов Zend Engine 2.0. Благодаря этому PHP стал работать быстрее примерно на 15-20%.

Новые возможности в PHP 5.3 (ссылка на офф. сайт):

?: — сокращение тернарного оператора

С PHP 5.3 стало возможным не писать среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1 если expr1 не пустой, и expr3 в противном случае.

Тернарный — состоящий из трёх частей, компонентов.

Пример тернарного оператора:

В короткой записи есть еще момент производительности, например:

В полной записи функция get_post_meta() вызывается 2 раза. В короткой один раз, и если она что-то вернула, второму аргументу сразу передается полученное значение: не нужны дополнительные переменные.

Илон Маск рекомендует:  Что такое код mssql_field_seek

$func = function()<>; — анонимные (лямбда) функции

Лямбда-функции еще называют «анонимными функциями», потому что для них не указывается название.

Лямбда-функции представляют собой замыкание (англ. closure) — это особый вид функции, которая определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. Насколько я понял, любая функция — это замыкание текущего контекста, т.е. контекст не будет очищен пока работает функция. Но если в функции есть лямбда-функция, то она становится замыканием, и если в неё передаются переменные из «верхней» функции, то они не будут очищены, до тех пор пока работает вложенная-функция, даже если «верхняя» функция работу закончила.

В ранних версиях, анонимные функции создавались с помощью функции create_function() .

Пример создания анонимной функции для сортировки usort():

Еще одна фишка лямбда-функций — это использование переменных из текущей области видимости, с помощью оператора use :

Переменные передаются как значение, но можно передать и ссылку на переменную, указав & :

method()->var — получение объекта из метода/функции

В PHP ниже 5.3 писали как-то так:

В php 5.3 можно использовать аналог HEREDOC, который называется NOWDOC. Особенность его в том, что внутри него переменные остаются простым текстом, как если бы мы указали её в строке с одинарными кавычками: ‘текст $foo’ :

namespace — поддержка пространств имен

Пространства имен нужны, чтобы избежать конфликтов при совпадении названий функций/классов/переменных/констант. Если коротко: одинаковые называния в разных пространствах — это разные названия.

Пример ниже должен объяснить почти все, что возможно в пространствах имен. За подробностями идем в официальную документацию.

__DIR__ — новая магическая константа

__DIR__ содержит директорию текущего файла — файла в котором она используется. Возвращает полный путь до текущего файла без закрывающего слэша, за исключением корневой директории.

__DIR__ можно заменить:

$class::$foo — динамичное указание класса

Это дает динамичный доступ к статическим методам/свойствам класса:

const — ключевое слово для создания констант вне классов

Сразу пример, где все понятно:

В отличие define() , такие константы, должны быть объявлены в самой верхней области видимости, потому что они определяются при компилировании скрипта. Это значит, что их нельзя объявлять внутри функций/циклов/выражений if или try/ catch блоков.

static::method() — статическое связывание

Статическое объявление метода/свойства связывает его с классом из которого оно вызывается, а не с тем в котором оно зарегистрировано. Посмотрим на примере:

Подробнее про статическое связывание читайте в документации.

goto hell; — оператор goto

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

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

Также нельзя перейти внутрь любой циклической структуры или оператора switch. Но можно выйти из любой циклической структуры, поэтому «goto» удобен как замена многоуровневых break.

Пример использования goto:

Пример использования goto в цикле:

__callStatic() , __invoke() — магические методы

__callStatic() — срабатывает, когда вызывается несуществующий метод из статического контекста: Foo::bar() :

__invoke() — срабатывает, когда объект выполняется как функция: $obj() :

Возможности, добавленные в версии PHP 5.4. Ссылка на офф. сайт.

— короткая запись вывода на экран работает всегда

Короткая запись о которой идет речь это: вместо .

Для работы такой короткой записи вывода на экран в версиях ниже 5.4 нужно было, чтобы опция short_open_tag в php.ini была включена.

Пример длинной и короткой записи:

[1,2] — запись массива, без слова array

trait Class <> — примеси (трейты)

Трейт — это аналог класса, который содержит в себе методы. Нужен он для «подмешивания» его в имеющийся класс, чтобы методы трейта стали методами класса в который он добавлен.

Несколько примесей можно задавать через запятую:

Приоритеты трейтов

При совпадении названий свойств/методов приоритеты расставляются так: текущий класс имеет наивысший приоритет, затем трейт, а затем расширяемый класс. Другими словами: элементы из текущего класса переопределяют элементы в трейте, которые в свою очередь переопределяют унаследованные элементы.

Статический доступ к методу примеси из класса

Когда в класс подмешивается trait, то его методы становятся методами класса, включая статические и статический доступ:

foo()[0] — быстрое получение элемента массива

Теперь не нужно сохранять массив, который вернула функция/метод в переменную и получать элемент массива из этой переменной. Можно сразу получать элемент из функции/метода:

(new Foo)->method() — доступ к элементу объекта при его создании

Class::<'foo'>() — динамичное указание метода

Чтобы вызвать статический метод/свойство класса, не нужно запоминать его в отдельную переменную:

callable — новый тип для аргументов функции/метода

Авто-проверка передаваемых данных в функции/методы, известная как «контроль типа» (typehint), продолжает развиваться и теперь понимает слово callable .

Раньше для автоматической проверки типа передаваемого параметра, в аргументах функции/метода можно было указывать только: array или имя класса .

Теперь, можно указать еще: callable — значит, что передаваемый аргумент должен быть вызываемым, т.е. удовлетворяет условию is_callable( $arg, false ) .

Оператор @ нужен для подавления вывода ошибок любого уровня. Вообще его использовать не рекомендуется, но иногда с ним короче:

Использовать @ нужно как можно реже и очень осторожно, потому что часто заметки и предупреждения дают понять, что логика кода работает неправильно. Например, у меня бывало что лезу поправить казалось бы безобидный NOTICE, но при анализе выясняется что ошибка появилась из-за неправильной логики кода, которая изменилась в процессе расширения кода.

Новые возможности в PHP 5.5 (ссылка на офф.сайт):

[1,3,4][2] , «foobar» <2>— разыменования только-созданных массивов и строк

empty() — можно применять к результатам функций и выражений

Раньше empty() мог принимать только переменные, теперь можно передавать сами выражения без необходимости сохранять результат в отдельную переменную:

В foreach стало возможным использовать list():

finally — в конструкции try/catch

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

А с версии 5.5. в эту конструкцию добавили третий блок finally . Блок finally выполняется всегда после завершается конструкции try/catch. Он выполняется даже когда код try вызвал фатальную ошибку:

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

Пару домонстрационных примеров:

Меньше кода

Допустим, нам нужно выполнить функцию close() в любому случае, было выброшено исключение или нет:

Больше возможностей

Допустим мы открыли соединение с БД до выполнения кода и есть вероятность что код вызовет ошибку и открытое соединение не закроется, а нам нужно его закрыть в любом случае. finally как раз кстати:

Подробнее про finally читайте статью на хабре.

Class::class — для получение имени класса в пространствах

Появилось ключевое слово class для классов, которое выводит название класса. В обычном режиме нам это не нужно, а вот при работе с пространствами (namespace) — это удобно:

yield — создание генераторов

Если говорить простым языком: yield похожа на return, она также возвращает значение, но она не обрывает работу функции, а приостанавливает её до тех пор пока не будет запрошено следующее значение. Благодаря этому создавать генераторы стало удобнее.

Как это работает на самом деле?

yield возвращает специальный объект — Generator. Когда функция generator() вызывается в цикле, например foreach, PHP выполнит код функции до первой встречи слова yield , на котором PHP прервет работу функции, запомнит позицию и выбросит значение (объект Generator). Затем, foreach обработает значение и вызовет метод next() у полученного объекта Generator. PHP снова выполнит код функции generator() , только начнет его не с начала, а с прошлой позиции, и опять, до слова yield, которое опять выбросит объект Generator. Работа цикла прервется тогда, когда функция generator() дойдет до конца (не вернет yield), или если она будет прервана с помощью return; .

Пример генератора который возвращает пару: ключ/значение:

Кратко о генераторах

— Не добавляют нового функционала в язык
— Быстрее
— Возобновление работы генератора происходит с последнего «выброса» yield
— В генератор можно отправлять значения и исключения (через метод throw())
— Генераторы однонаправлены, т.е. нельзя вернуться назад
— Меньше кода в большинстве случаев, более простые для понимания конструкции

Чтобы лучше понять генераторы прочитайте эту статью на Хабре.

API для хэширования паролей

Теперь PHP из коробки предлагает правильный способ хэшировать пароли. Новый API хэширования паролей предоставляет четыре функции:

password_hash() — используется для хэширования пароля. В WP для этого есть своя функция wp_hash_password().

password_verify() — используется для проверки пароля на соответствие хэшу. В WP для этого есть своя функция wp_check_password().

password_needs_rehash() — используется для проверки необходимости создать новый хэш.

  • password_get_info() — возвращает имя алгоритма хеширования и различные параметры, используемые при хэшировании.
  • Новые возможности PHP 5.6. Ссылка на офф.сайт.

    const PLUS = 1 + 2; — скалярные выражения в константах/свойствах/аргументах функции

    Теперь стало возможным указывать в значения констант примитивные PHP выражения (выражения из скаляров).

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

    const ARR = [‘a’, ‘b’]; — константа может хранить массив

    Стало возможным держать в константе массивы:

    func( . $args ) или func( . [2, 3] ) — неизвестное число аргументов функции или распаковка массива с помощью ‘. ‘ (splat оператор)

    Когда мы не знали заранее, сколько параметров может получить функция, нам приходилось внутри функции обрабатывать переданные параметры с помощью специальных функций: func_num_args(), func_get_arg(), func_get_args().

    Теперь они не нужны и мы можем получить все параметры в одной переменной, для этого перед этой переменной нужно указать оператор . :

    Оператор . еще называют «Splat Оператор», например в языке Ruby

    Быстрая распаковка передаваемых параметров функции

    Теперь с помощью splat оператора . , можно указать параметры функции сразу из значений массива:

    Замена медленной функции call_user_func_array()

    Теперь call_user_func_array( $callback, $param_arr ) , которая обычно не самая быстрая, можно заменить так:

    ** — оператор возведения в степень

    До php 5.6, чтобы возвести число в степень нужно было использовать функцию pow(2,2); , а теперь есть оператор ** :

    use function и use const — импорт функций и констант в пространство

    Теперь стало возможным при помощью ключевого слова use подключать функции или константы другого пространства в наше:

    Остальные новинки PHP 5.6 не связанные с синтаксисом, смотрите в статье на Хабре.

    Куда делся PHP 6?

    Умер не родившись. В ядро PHP 6 планировали внедрить полную поддержку юникода, но затея оказалась слишком амбициозной, а объем работ слишком велик. К тому моменту, когда это стало понятно, о PHP 6 уже было написано не мало статей. Чтобы не было путаницы, из-за того что новая версия стала преследовать совсем другие цели (производительность) и сильно отличалась по концепции от PHP 6, было решено пропустить PHP 6. Еще одной причиной стало наличие весомого количества недоделанного кода в репозитории PHP, который решили не трогать, чтобы тот в ответ тоже никого не трогал.

    3 декабря 2015 года было объявлено о выходе PHP 7. Новая версия основывается на экспериментальной ветке PHP, которая изначально называлась phpng (PHPNextGeneration — следующее поколение), и разрабатывалась с упором на увеличение производительности и уменьшение потребления памяти.

    Самой важной новинкой стало изменение ядра интерпретатора: теперь он называется PHPNG (Next Generation). Благодаря PHPNG удалось увеличить скорость обработки скриптов почти в двое по сравнению с PHP 5.x. Так же появился более эффективный менеджер памяти.

    Прирост в скорости на практике хорошо виден на этой картинке. А для WordPress прирост в скорости выглядит так:

    Синтаксические новинки PHP 7:

    $a ?? » — одновременная проверка isset и получение значения

    Новый оператор слияния с NULL (NULL coalescing operator) ?? — это сокращение проверки isset и получения значения, если проверка пройдена.

    Такая проверка часто была нужна в тернарном операторе ?: :

    Так же, проверять можно по цепочке:

    $a $b — одновременное выполнение трех сравнений: больше, равно или меньше.

    Новый оператор сравнения — «spaceship operator» (космический корабль). Сравнивает 2 переменные и возвращает результат сравнения в виде числа:

    • -1 — если в сравнении подходит первый символ оператора
    • 0 — подходит второй символ =
    • 1 — подходит третий символ >

    Удобен для использования в колбэках для usort().

    define(‘FOO’, [1,2]); — передача массива константе через define()

    Константы могут содержать массивы еще с PHP 5.6. Но тогда их можно было передавать только через ключевое слово const. Теперь их можно указывать еще и через define().

    use name\space\; — группировка импорта при помощи use

    Теперь для краткой записи, импорт данных в наше пространство можно группировать:

    int, float, bool — новые типы для аргументов функции/метода

    Авто-проверка типа передаваемых данных в функции/методы, известная как «контроль типа» (typehint), продолжает развиваться и теперь понимает скаляры: int , float , bool , string . Раньше понимались только типы: array , имя класса или callable (с версии 5.4).

    Режим строгой типизации

    Если указан тип int и передать строку ‘123’ то проверка все равно будет пройдена, и php превратить строку в число.

    Но что, если нужно получать именно число 123? Для этого можно включить режим строгой типизации, поместив в самое начало файла такую строку:

    Это объявление должно быть первой строкой в файле, до выполнения какого-либо кода. Оно затрагивает только код файла и только вызовы и возвращаемые значения в этом файле.

    Заметка: если строгая типизация указана в файле X, но не указана в файле Y и в файле Y вызывается функция из файла X. То вызов такой функции не будет подвержен строгой типизации!

    int, float, bool, array — указание возвращаемых типов для функции/метода

    Указывать принимаемый тип, можно еще с версии PHP 5.3. А вот указать какой тип функция/метод должна вернуть доступно только с версии PHP 7. Тут понимаются все типы: string , int , float , bool , array , callable , self (в методах), parent (в методах) , Closure , имя класса , имя интерфейса .

    Возвращаемые типы при наследовании методов класса

    При наследовании в классах, дочерние методы должны иметь такие же возвращаемые типы как и в родительском классе/интерфейсе:

    Навороченный пример того, как можно писать в PHP 7

    Тут сразу несколько новинок:

    1. принимаемый и возвращаемый тип;
    2. объединение и распаковка параметров с помощью . ;
    3. пример создания анонимной функции с указанием возвращаемого типа данных.

    foo()(), $a::$b::$c, $$foo->bar — единый синтаксис переменных: СЛЕВА НАПРАВО

    Очень важная новинка! Теперь обращения к сложносочиненным переменным разбираются последовательно СЛЕВА НАПРАВО.

    Примеры новых возможностей:

    Примеры разницы старого и нового распознавания:

    Старый код написанный с использованием <> для обработки переменных возможно не будет работать в новой версии PHP7.

    foreach — изменена логика работы

    Теперь foreach не переключает автоматически внутренний указатель перебираемого массива, т.е. next() не работает автоматически.

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

    Переключение указателей и влияние на работу цикла в PHP 7:

    Анонимные классы позволяют делать тоже самое что и обычные классы: передавать данные в конструктор, наследовать другие классы, использовать трейты и т.п.

    Расширение классов работает как и ожидается:

    Подробнее про анонимные классы читайте в документации и на wiki.php.net.

    yield . return 99; — возврат (return) выражений в генераторах

    Функции-генераторы появились в PHP 5.5. Но там можно было использовать return, только чтобы прервать работу генератора. Теперь return может возвращать выражение (значение/массив/другой генератор), а не только NULL. Но сделать это можно только в конце работы генератора.

    Получить возвращенное значение можно методом getReturn() , но только по завершении работы генератора.

    Возможность явно вернуть последнее значение упрощает работу с генераторами:
    теперь не нужно проверять является ли значение последним, а просто вызываем getReturn().

    yield from gen() — делегирование генераторов

    Позволяет разбить сложный генератор на несколько простых.

    Для этого используется новый синтаксис: yield from , где может быть значением (скаляром), массивом или другим генератором.

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

    Пример с массивом:

    Пример с return из дочернего генератора:

    Еще новинки PHP 7.0

    Синтаксис конструкторов в стиле PHP 4 (имя метода конструктора совпадает с именем класса) теперь считается устаревшим.

    Статичные вызовы :: нестатичных методов теперь считаются устаревшими.

    list() — изменение поведения. В PHP 5, list() устанавливал значения начиная с правого крайнего значения указанного массива, в PHP 7 параметры устанавливаются начиная с левого крайнего значения массива. Так же в PHP 5 list() умела разбивать строки на символы, в PHP 7 не работает со строками вообще.

    Поддержка юникод управляющих (escape-) последовательностей. Т.е. в строках «» и heredoc можно использовать конструкцию \uXXXX для создания юникод символа. Вот так:

    Класс IntlChar. Cодержит методы и константы для работы с юникодом.

    Функция intdiv() — делит 2 числа и возвращает только целую часть от деления:

    session_start() умеет получать параметры (стандартные настройки сессий из php.ini):

    Функция preg_replace_callback_array() — альтернатива preg_replace_callback(). Позволяет передать в качестве обратной функции — массив [‘/regex’/ => callback, . ] :

  • Можно использовать глобальные ключевые слова в названиях методов. Т.е. раньше нельзя было назвать метод словами: with/new/for/foreach/. — это приводило к ошибке. Теперь можно:
  • Подробнее о новинках PHP 7 читайте в этой статье и вторая часть.

    void — возвращаемый тип

    Теперь функции и методы, которые не должны ничего возвращать, можно помечать возвращаемым типом void . Оператор return при этом должен отсутствовать или должен быть пустым — return; . Вызов return null; вызовет ошибку.

    iterable — новый псевдо-тип

    Введен новый тип iterable для передаваемых/возвращаемых значений. Может использоваться при передаче массивов или объектов, которые соответствуют интерфейсу Traversable.

    null — тип передаваемых/возвращаемых значений

    В PHP 7.0 стало возможным указать тип возвращаемых/передаваемых значений, но типизация не допускала использование null в качестве значения параметра.

    В PHP 7.1 для разрешения null-значений перед типом параметра указывается «?»:

    <-1>— отрицательное значение смещения в строках

    Добавлена возможность использовать отрицательное значение для смещения в строках

    [‘key’=>$a] = [‘key’=>’Значение’] — поддержка ключей и новый синтаксис list()

    Теперь, можно использовать новый синтаксис — аналог list(), в котором разрешено использовать строковые ключи:

    Область видимости констант в классах

    Конец публичным константам, теперь для констант можно указать видимость:

    Заметки по PHP 7.1

    PHP движется в сторону строгой типизации данных и при переходе на 7.1 я столкнулся с ФАТАЛЬНОЙ ошибкой. И мне это показалось очень странным. Приведу пример:

    При Warning PHP еще работает, а дальше уже нет! А еще в 7.0 код просто работал, даже без предупреждений и нотисов. Похоже на недоработку в PHP 7.1.

    К примеру, ошибка такого типа есть в популярном плагине WP Super Cache (отписал авторам, надеюсь скоро поправят).

    Как запустить php новичку

    Выдача в денвере:

    13.08.2013, 12:10

    Как запустить php скрипт?
    Парни всем привет! Подскажите такой момент! Я Установил стек LAMP и Sublime text3 Все это в.

    Как запустить Php-парсер?
    Здравствуйте, друзья. Имеется лишь опыт разработки веб-сайтов. В плане php касался лишь.

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

    Как запустить код PHP в HTML?
    Хочу заняться PHP, а для этого мне хочется, чтобы он запускался в HTML странице.Но. Когда я пишу.

    Илон Маск рекомендует:  Как сделать ссылку на адрес электронной почты

    как в php запустить exe-шник?
    Необходимо в php использовать архиватор, с возможностью архивирования нескольких файлов с.

    Отличия (различия) PHP4 и PHP5

    Особенности языка

    • PHP5 поддерживает ограниченное количество указателей типа. Это позволяет вам указать определенный тип данных для параметра функции или метода класса (или один из подтипов), или массив. Однако, вы не можете определить другие скалярные типы.
    • Конструкция foreach теперь поддерживает объявление значения элемента по ссылке.
    • К ядру платформы был добавлен ряд новых функций для работы со строками и массивами.

    Объекты

    • Для всех намерений и целей, все объекты в PHP5 передаются по ссылке. Это
      означает, что назначение объекта переменной не будет приводить к созданию его копии,
      а предполагает создание еще одной ссылки на него.
    • Константы, также как статические методы и свойства, могут быть определены в рамках класса.
    • Методы и свойства класса теперь имеют функции видимости (модификаторы ограничения доступа), и могут быть объявлены как
      public, private или protected. Классы и методы могут также быть объявлены как final, для предотвращения их переопределения в производных классах.
    • Так как все объекты присваиваются по ссылке, необходим специализированный механизм
      для копирования объектов. Для этого можно использовать ключевое слово clone и специальный («магический») метод __clone().
    • В PHP5 добавлены унифицированные функции конструктора (__construct()) и деструктора (__destruct()) объектов, при этом деструктор является новым для PHP методом, предназначенным для уничтожения объектов.
    • C добавленными интерфейсами и абстрактными классами, PHP-разработчики теперь могут иметь больший контроль над применением ООП.
      Интерфейсы могут использоваться для определения общих API, в то время как абстрактные классы описывают модели для реализаций класса, которые следуют определенному плану (проекту).
    • Определения классов теперь могут быть загружены по требованию с помощью функции __autoload().

    Магические методы

    В PHP5 было введено множество новых «магических» методов:

    • __get() и __set() методы вызываются при доступе к свойству неопределенного объекта или присвоении ему значения, в то время как __call() выполняется при вызове несуществующего метода класса.
    • __isset() метод срабатывает при вызове функций isset() на несуществующем или недоступном свойстве класса.
    • __unset() метод срабатывает при вызове функции unset() с неопределенным свойством класса в качестве аргумента.
    • __toString() метод срабатывает при попытке использованию напрямую конструкции echo или функции print() для объекта.
    • __set_state() метод срабатывает динамически для тех классов, которые экспортируются функцией var_export().

    Некоторые новые расширения

    • SimpleXML обеспечивает легкий доступ к XML данным используя объектную и нотацию массивов.
    • PHP5 также представляет DOMXML, DOMXSL и Sablotron замена в форме основанного на libxml2 DOM и XSL расширения.
    • PHP Data Objects (PDO) расширение обеспечивает объединенное расширение доступа к базам данных которое позволяет производить доступ к различным типам систем баз данных при использовании общего интерфейса и методов. PDO не использует абстрактных слоёв для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности.
    • Hash-расширение является заменой GPLed libmhash; оно было добавлено в ядро PHP с версии 5.1.2. Она позволяет производить hash используя много алгоритмов, включая как знакомые MD5 и SHA1, так и более безопасные (хотя более медленные), например, snefru.
    • Стандартная PHP библиотека (SPL) обеспечивает многочисленные интерфейсы, которые увеличивают пути взаимодействия классов с языком PHP, включая новые интерфейсы Iterator.
    • Новое расширение Reflection позволяет производить самоанализ во время выполнения кода PHP.

    Управление обработкой ошибок

    • Классы теперь поддерживают исключения; функция set_exception_handler() позволяет определить обработчик исключений для всего срипта.
    • Был добавлен новый уровень сообщений об ошибках — E_STRICT, для генерации предупреждений о устаревших методах программирования в коде.

    Подробнее:

    Новые возможности языка

    Новая объектно-ориентированная модель

    Когда Зив Сераски (Zeev Suraski) добавил объектно-ориентированный (ОО) синтаксис в PHP 3, это можно было рассматривать как «синтаксический подсластитель для поддержки классов» («syntactic sugar for accessing collections»). Объектно-ориентированная модель получила поддержку наследования и позволяла классу (и объекту) объединять методы и свойства, но не более того. Когда Зив и Анди переписали движок для PHP 4, это был полностью новый движок, работающий много быстрее, намного стабильнее и с еще многими другими возможностями. Однако, изменения практически не затронули ОО модель, первоначально введенную еще в РНР 3.

    Хотя объектная модель имела серьезные ограничения, она широко использовалась, часто в очень больших приложениях, написанных на PHP. Это победное шествование парадигмы ООП, даже такой ограниченной в РНР 4, привело к тому, что изменения объектной модели стали центральными в новом релизе РНР.

    Какие были ограничения в PHP 3 и 4? Самым большим ограничением (которое и приводило ко всем остальным ограничениям) был тот факт, что семантика экземпляра объекта была такой же, что и для родных типов. Как это фактически отражалось на разработчиках? Когда вы присваивали переменную (которая указывает на объект) другой переменной, то создавалась копия объекта. Мало того, что это влияло на производительность, но и это обычно приводило к ошибкам в приложении, потому что многие разработчики думали, что обе переменные будут указывать на тот же самый объект. А они указывали на разные копии того же самого объекта, поэтому, изменяя один объект, мы не меняли другой.

    class Person <
    var $name ;
    function getName () <
    return $this -> name ;
    >
    function setName ( $name ) <
    $this -> name = $name ;
    >
    function Person ( $name ) <
    $this -> setName ( $name );
    >
    >

    function changeName ( $person , $name ) <
    $person -> setName ( $name );
    >

    $person = new Person ( «Andi» );
    changeName ( $person , «Stig» );
    print $person -> getName ();
    ?>

    В РНР 4 этот код выведет «Andi». Причина кроется в том, что мы передаем объект $person в функцию changeName() по значению, а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person.

    Такое поведение не является интуитивно понятным. Действительно, многие разработчики ожидали Java-подобного поведения. В Java, переменные фактически являются указателями на объект, и поэтому при дублировании будет скопирован указатель, а не сам объект.

    Было два вида разработчиков: те, кто знал об этой проблеме, и те, кто не знал. Последние, обычно, не сталкивались с этой проблемой, потому что их код был написан так, что было безразлично, существует ли такая проблема или нет. Конечно, некоторые из этих разработчиков проводили бессонные ночи в «увлекательных» поисках «сверхъестественных» ошибок. Первая группа также имела проблему, поскольку приходилось вручную определять передачу объекта по ссылке, запрещая движку копировать объекты, и код был испещрен многочисленными знаками ‘&’.

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

    В PHP 5 объектная модель была полностью переписана для того, чтобы сразу работать с указателями на объект. Если вы явно не клонируете объект, используя ключевое слово clone, вы никогда не будете работать с копией объекта, думая, что работаете с самим объектом. В PHP 5 уже не нужно явно передавать объекты или присваивать их по ссылке, это делается автоматически.

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

    Новое в объектно-ориентированном подходе

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

    Ниже представлен обзор главных изменений:

      public/private/protected — модификаторы доступа для методов и свойств

    Позволяют управлять доступом к методам и свойствам.

    class MyClass <
    private $id = 18 ;

    public function getId () <
    return $this -> id ;
    >
    >
    ?>

    Унифицированный конструктор __construct()

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

    class MyClass <
    function __construct () <
    print «Inside constructor» ;
    >
    >
    ?>

    Поддержка деструктора для класса, определяемого как метод __destructor()

    Позволяет определить функцию деструктора, которая будет выполнена при уничтожении объекта.

    class MyClass <
    function __destruct () <
    print «Destroying object» ;
    >
    >
    ?>

    Класс может наследовать только один класс, но при этом может иметь столько интерфейсов, сколько потребуется.

    <
    function display ();
    >

    class Circle implements Display <
    function display () <
    print «Displaying circle » ;
    >
    >
    ?>

    Поддержка проверки зависимости от других объектов. Функцией is_a(), известной из PHP 4, пользоваться теперь не рекомендуется.

    if ( $obj instance of Circle ) <
    print ‘$obj is a Circle’ ;
    >
    ?>

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

    class MyClass <
    final function getBaseClassName () <
    return __CLASS__ ;
    >
    >
    ?>

    Классы, помеченные как final

    После объявления класса final он не может быть унаследован. Следующий пример вызовет ошибку:

    class BogusClass extends FinalClass <
    >
    ?>

    Явное клонирование объекта

    Чтобы явно клонировать объект, вы должны использовать ключевое слово clone. Вы можете объявить метод __clone(), который будет вызван при клонировании объекта (после того, как все свойства будут скопированы из исходного объекта).

    class MyClass <
    function __clone () <
    print «Object is being cloned» ;
    >
    >
    $obj = new MyClass ();
    clone $obj ;
    ?>

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

    class MyClass <
    const SUCCESS = «Success» ;
    const FAILURE = «Failure» ;
    >
    print MyClass :: SUCCESS ;
    ?>

    Статические члены класса

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

    class Singleton <
    static private $instance = NULL ;

    private function __construct () <
    >

    static public function getInstance () <
    if ( self :: $instance == NULL ) <
    self :: $instance = new Singleton ();
    >
    return self :: $instance ;
    >
    >
    ?>

    Вы можете теперь определить методы как статические, разрешая им быть вызванными вне контекста объекта. Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом.

    class MyClass <
    static function helloWorld () <
    print «Hello, world» ;
    >
    >
    MyClass :: helloWorld ();
    ?>

    Класс может быть объявлен как абстрактный при помощи использования ключевого слова abstract, для исключения из обработки движком описания класса. Однако, вы можете наследовать абстрактные классы.

    class MyBaseClass <
    function display () <
    print «Default display routine being called» ;
    >
    >
    ?>

    Метод может быть объявлен как abstract, таким образом отложив его определение наследуемым классом. Класс, который включает абстрактные методы, должен быть объявлен как abstract.

    class MyBaseClass <
    abstract function display ();
    >
    ?>

    Указание класса как типа

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

    function expectsMyClass ( MyClass $obj ) <

    Поддержка разыменования объектов, которые возвращаются методами.

    В PHP 4 вы не могли непосредственно разыменовывать объекты, которые возвращаются из методов. Вы должны были бы сначала присвоить такой объект некой фиктивной переменной.

    Поясним на примере. В PHP 4:

    = $obj -> method ();
    $dummy -> method2 ();
    ?>

    PHP 5 позволяет последовательно получать доступ к элементам класса через конструкцию foreach().

    = new MyIteratorImplementation ();
    foreach ( $obj as $value ) <
    print «$value» ;
    >
    ?>

    Многие разработчики, пишущие объектно-ориентированные приложения, создают один файл, в котором содержится определение класса. Очень неудобно писать в начале каждого скрипта длинный список включаемых файлов по одному на каждый класс.

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

    function __autoload ( $class_name ) <
    include_once( $class_name . «php» );
    >

    $obj = new MyClass1 ();
    $obj2 = new MyClass2 ();
    ?>

    Другие новые возможности языка

    PHP 5 добавляет парадигму обработки исключений, вводя структуру try/throw/catch. Вам остается только создать объекты, которые наследуют класс исключений Exception.

    class SQLException extends Exception <
    public $problem ;
    function __construct ( $problem ) <
    $this -> problem = $problem ;
    >
    >

    try <
    .
    throw new SQLException ( «Couldn’t connect to database» );
    .
    > catch ( SQLException $e ) <
    print «Caught an SQLException with problem $obj->problem» ;
    > catch ( Exception $e ) <
    print «Caught unrecognized exception» ;
    >
    ?>

    В настоящее время в целях обратной совместимости большинство внутренних функций не использует исключения. Однако, все новые расширения будут иметь такую возможность, и вы можете использовать такую конструкцию в своем исходном тексте. Кроме того, подобно уже существующей функции set_error_handler(), вы можете использовать set_exception_handler(), чтобы отловить необработанное исключение прежде, чем выполнение скрипта будет закончено.

    foreach с сылкой

    В PHP 4 вы не могли пройтись с помощью foreach() по массиву, изменяя его значения. В PHP 5 разрешено выполнять foreach (), используя признак ссылки (‘&’), таким образом, меняя переменную, вы меняете элементы массива, по которому проходит итерация.

    Значения по умолчанию для параметров, передаваемых по ссылке

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

    Основные изменения в РНР

    XML и Web Services

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

    Поддержка XML в PHP 4 базировалась на разнообразных библиотеках XML. Поддержка SAX осуществлялась старой библиотекой Expat, для использования XSLT необходима была библиотека Sablotron, для DOM использовалась более мощная libxml2 — библиотека проекта GNOME.

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

    В PHP 5 все расширения XML были переписаны, чтобы использовать отличный набор инструментов, предоставляемый libxml2 (http://www.xmlsoft.org/). Это библиотека богатая возможностями, отлично сопровождаемая и эффективно реализовавшая стандарты XML, предоставляющая передовые возможности технологии XML в PHP.

    Все вышеупомянутые расширения (SAX, DOM и XSLT) теперь используют libxml2, включая новые дополнительные расширения — SimpleXML и SOAP.

    Как говорилось выше, новая реализация SAX переведена от использования Expat к libxml2. Хотя новое расширение должно быть совместимо, могут быть некоторые тонкие различия. Разработчики, которые хотят продолжать работать с библиотекой Expat, могут это сделать, конфигурируя и собирая PHP соответствующим образом (не рекомендовано).

    Хотя поддержка DOM в PHP 4 была также основана на библиотеке libxml2, она изобиловала ошибками, грешила утечками памяти, и API во многих случаях не соответствовал рекомендациям W3C. Расширение DOM было полностью переписано для PHP 5. Мало того, что расширение было коренным образом переписано, теперь оно соответствует рекомендациям W3C. Например, названия функций теперь используют нотацию studlyCaps (присваивание имен со смешанным употреблением заглавных и строчных букв) как предписано по стандарту W3C, облегчая для вас применение прочитанного в документации W3C в PHP. Кроме того, расширение DOM теперь поддерживает три вида схем для валидации XML документов — DTD, XML Schema и RelaxNG.

    В результате этих изменений код, написанный для PHP 4 с использованием DOM, не всегда будет выполняться в PHP 5. Однако, простая корректировка названий функций к новому стандарту в большинстве случаев решает проблему.

    В PHP 4, было два расширения, которые поддерживали XSL-преобразования. Первое использовало Sablotron, а второе — поддержку XSLT в расширении DOM. В PHP 5 новое расширение XSL было основано на использовании libxml2. Так, в PHP 5 XSL-преобразование не принимает таблицу стилей XSLT в качестве параметра, но зависит от расширения DOM, чтобы загрузить ее. Таблица стилей может кэшироваться в памяти, и может быть применена ко многим документам для существенной экономии времени выполнения.

    Вероятно, через год или два, оглянувшись назад, мы сможем сказать, что SimpleXML коренным образом изменил работу с XML-документами для PHP разработчиков. SimpleXML можно было бы действительно называть «XML для чайников». Вместо того, чтобы иметь дело с DOM или, что еще хуже, SAX, SimpleXML позволяет представить ваш XML-документ как родной объект PHP. Вы можете читать, писать или пробегаться по вашему XML-документу, с легкой непринужденностью получая доступ к элементам и атрибутам.

    Рассмотрите следующий XML-документ:

    clients >
    client >
    name > John Doe name >
    account_number > 87234838 account_number >
    client >
    client >
    name > Janet Smith name >
    account_number > 72384329 account_number >
    client >
    clients >

    Следующий фрагмент кода печатает имя каждого клиента и номер его аккаунта:

    = simplexml_load_file ( ‘clients.xml’ );
    foreach ( $clients -> client as $client ) <
    print «$client->name has account number $client->account_number » ;
    >
    ?>

    Как видим, SimpleXML действительно прост.

    А в случае, если есть необходимость сделать что-то, что невозможно выполнить в рамках SimpleXML, вы можете преобразовать свой объект SimpleXML в дерево DOM, вызвав функцию dom_import_simplexml(), выполнить необходимое, и вернуться назад к SimpleXML, используя simplexml_import_dom(). Благодаря тому, что оба расширения реализованы в одной библиотеке XML, переключения между ними теперь реальны.

    Официально поддержка SOAP в PHP 4 отсутствовала. Обычно, при необходимости использовать SOAP, приходилось использовать PEAR, но поскольку код был написан полностью на PHP, приложение не могло выполняться так же, как встроенное С-расширение. Другие доступные С-расширения так и не смогли достичь стабильной версии и широкого применения, и поэтому не были включены в PHP 5.

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

    Следующий код демонстрирует вызов функции SomeFunction(), определенной в WSDL-файле:

    = new SoapClient ( «some.wsdl» );
    $client -> SomeFunction ( $a , $b , $c );
    ?>

    Новое расширение MySQLi (усовершенствованная MySQL)

    В PHP 5 для MySQL AB (http://www.mysql.com/) было написано новое расширение MySQL, которое позволяет вам полностью использовать преимущества новых функциональных возможностей в MySQL 4.1 и более новых версий. В противовес старому расширению MySQL новое дает вам возможность использовать оба интерфейса: функциональный и объектно-ориентированный. Так что теперь у вас есть выбор что предпочесть. Новые возможности, поддерживаемые этим расширением, включают контроль транзакций, поддержку репликаций, SSL и многое другое.

    Расширение SQLite

    Поддержка SQLite (http://www.sqlite.org/) изначально была введена в PHP 4.3.x. Это встроенная библиотека SQL, которая не требует SQL сервера и очень подходит для приложений, которые не требуют масштабируемых SQL-серверов, или если вы разворачиваете свое приложение у провайдера, который не предоставляет вам доступ к SQL-серверу. Вопреки названию, SQLite очень богата возможностями и поддерживает транзакции, вложенные выборки, представления (view) и большие DB-файлы. Здесь это упомянуто, как возможность PHP 5, потому что поддержка SQLite была введена довольно в поздних релизах PHP 4, и поскольку PHP 5 предоставляет новый объектно-ориентированный интерфейс и поддерживает итераторы.

    Tidy расширение

    PHP 5 включает поддержку очень полезной библиотеки Tidy (http://tidy.sf.net/). Она позволяет разработчикам PHP разбирать, диагностировать, чистить и восстанавливать документы HTML. Tidy расширение поддерживает как функциональный, так и объектно-ориентированный интерфейс, и ее API использует механизм исключений РНР 5.

    Perl extension

    Хотя и не включенное по умолчанию в РНР 5, расширение Perl позволяет вам вызывать Perl-скрипты, использовать объекты Perl и использовать другие функциональные возможности Perl прямо из кода PHP. Это новое расширение можно найти в репозитарии PECL http://pecl.php.net/package/perl.

    Другие новшества в PHP 5

    Новый менеджер памяти

    Zend Engine использует новый менеджер памяти. Два главных его преимущества: улучшенная поддержка многопоточных сред (распределенные блоки не нуждаются во взаимных исключительных блокировках) и то, что после каждого запроса намного эффективнее освобождаются распределенные блоки памяти. Поскольку это касается в основном изменений инфраструктуры, вы, как конечный пользователь, не заметите этого.

    Прекращена поддержка Windows 95

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

    Выводы

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

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL