В продолжение статьи:
Ускорение и оптимизация PHP-сайта. Какие технологии стоит выбирать при настройке сервера под PHP
В отличии от предыдущего материала, в этой статье сделан упор на сравнение скорости отклика и интерпретации кода для различных версий PHP, включая PHP 7 beta3.
Для ранних версий PHP, проведено тестирование между оптимизаторами кода apc, xcache и opcaсhe.
Эта статья не содержит тестов на производительность, таких как нагрузочные тесты ab и siege. Возможно, об этом я напишу в одной из следующих статей.
В данном случае, меня не интересует сколько страниц за секунду способна сгенерировать та или иная версия php-интерпретатора, скорее то, с какой скоростью она сгенерирует мне страницу и с какой задержкой.
В данном случае разница в том, что тесты производительности замеряют отношение скорости интерпретатора к общим ресурсам сервера, а так же подготовленности других связанных компонентов web-системы к работе на повышенных нагрузках.
Остановимся на скорости и отклике. Очевидно что производительность зависит от скорости, но высокая скорость не может гарантировать высокую производительность. Это, возможно, связанно с тем, что недостаточно хорошо настроен web-сервер или база данных, а также с какими-то не было ограничениями, например сетевого стека.
Что бы не заниматься попыткой объять необъятное, мы просто замерим скорость и отклик работы интерпретаторов php, на мощном сервере без нагрузки, с одинаковыми конфигурациями web-сервера, базы данных и операционной системы для всех испытуемых. Используем конфигурацию php-fpm + nginx. База данных MariaDB. Все технические детали скрыты под спойлером ниже.
Так же вы можете прочитать другие мои публикации на тему «Идеального» кластера
- «Идеальный» кластер. Часть 3.1 Внедрение MySQL Multi-Master кластера
- «Идеальный» кластер. Часть 2.2: Высокодоступный и масштабируемый web-сервер, лучшие технологии на страже вашего бизнеса
- О виртуальном кластере на hetzner
- Frontend: NGINX + Keepalived (vrrp) на CentOS
- HAPRoxy для Percona или Galera на CentOS. Его настройка и мониторинг в Zabbix
- Zabbix 2.2 верхом на nginx + php-fpm и mariadb
Испытуемый сервер:
CPU: Intel Xeon E5-1620v2 4c/8t 3,7 GHz+/3,9 GHz+
RAM: 64 GB DDR3 ECC 1600 MHz
Intel DC S3500 Series 300 Гб.
Centos 6.7:
Linux 2.6.32-40-pve #1 SMP Fri Jul 24 11:16:05 CEST 2015 x86_64 x86_64 x86_64 GNU/Linux
sysctl:
net.ipv4.ip_forward=1
kernel.sysrq=1
net.ipv4.tcp_syncookies=1
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0
kernel.msgmnb=65536
kernel.msgmax=65536
kernel.shmmax=4294967295
kernel.shmall=268435456
net.netfilter.nf_conntrack_max=99999999
fs.inotify.max_user_watches=99999999
net.ipv4.tcp_max_tw_buckets=99999999
net.ipv4.tcp_max_tw_buckets_ub=65535
net.ipv4.tcp_max_syn_backlog=65536
net.core.somaxconn=65535
fs.file-max=99999999
kernel.sem=1000 128000 128 512
vm.dirty_ratio=5
fs.aio-max-nr=262144
kernel.panic=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.ip_dynaddr=1
kernel.shmmni=4096
net.ipv4.tcp_keepalive_time=15
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_timestamps=0
PHP
PHP 5.3.29 (cli) (built: Aug 14 2014 14:15:02)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2014 Zend Technologies
PHP 5.3.29 (cli) (built: Aug 14 2014 14:15:02)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2014 Zend Technologies
with XCache v3.2.0, Copyright © 2005-2014, by mOo
with XCache Cacher v3.2.0, Copyright © 2005-2014, by mOo
PHP 5.3.29 (cli) (built: Aug 14 2014 14:15:02)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2014 Zend Technologies
with Zend OPcache v7.0.5, Copyright © 1999-2015, by Zend Technologies
The Zend Engine API version 220100525 which is installed, is newer.
Contact Zend Technologies at www.zend.com for a later version of Zend Guard Loader.
PHP 5.4.42 (cli) (built: Jun 12 2015 09:19:10)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright © 1998-2014 Zend Technologies
PHP 5.4.42 (cli) (built: Jun 12 2015 09:19:10)
Copyright © 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright © 1998-2014 Zend Technologies
with XCache v3.2.0, Copyright © 2005-2014, by mOo
with XCache Cacher v3.2.0, Copyright © 2005-2014, by mOo
PHP 5.5.27 (cli) (built: Jul 10 2015 23:40:40)
Copyright © 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright © 1998-2015 Zend Technologies
PHP 5.6.11 (cli) (built: Jul 10 2015 22:43:20)
Copyright © 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright © 1998-2015 Zend Technologies
PHP 7.0.0beta3 (cli) (built: Aug 5 2015 19:11:12)
Copyright © 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright © 1998-2015 Zend Technologies
XCache
[xcache]
xcache.shm_scheme = «mmap»
xcache.size = 1G
xcache.count = 8
xcache.slots = 8K
xcache.ttl = 3600
xcache.gc_interval = 3600
xcache.var_size = 64M
xcache.var_count = 2
xcache.var_slots = 8K
xcache.var_ttl = 3600
xcache.mmap_path = "/tmp/xcache"
xcache.cacher = On
xcache.stat = On
xcache.optimizer = On
xcache.test = Off
xcache.readonly_protection = Off
[xcache.coverager]
xcache.coverager = Off
xcache.coveragedump_directory = ""
OpCache
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=1024
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=3907
opcache.fast_shutdown=1
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
APC
extension = apc.so
apc.enabled=1
apc.shm_size=1024M
apc.ttl=86400
apc.user_ttl=7200
apc.num_files_hint=20000
apc.enable_cli=1
apc.cache_by_default=1
Nginx:
nginx version: nginx/1.9.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --http-client-body-temp-path=/var/cache/nginx/client_body --http-proxy-temp-path=/var/cache/nginx/proxy --http-fastcgi-temp-path=/var/cache/nginx/fastcgi --http-uwsgi-temp-path=/var/cache/nginx/uwsgi --http-scgi-temp-path=/var/cache/nginx/scgi --lock-path=/var/run/nginx.lock --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_spdy_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-stream_ssl_module --with-stream --with-threads --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-mail_ssl_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-pcre --with-debug --add-module=/usr/src/nginx-1.9.3/ModSecurity-master/nginx/modsecurity --add-module=/usr/src/nginx-1.9.3/ngx_cache_purge-master --add-module=/usr/src/nginx-1.9.3/ngx_pagespeed-master --add-module=/usr/src/nginx-1.9.3/nginx-push-stream-module-master --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E
worker_processes auto;
timer_resolution 100ms;
pid /var/run/nginx.pid;
thread_pool default threads=32 max_queue=655360;
events {
worker_connections 10000;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$host — $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
log_format defaultServer '[$time_local][$server_addr] $remote_addr ($http_user_agent) -> "$http_referer" $host "$request" $status';
log_format downloadsLog '[$time_local] $remote_addr "$request"';
log_format Counter '[$time_iso8601] $remote_addr $request_uri?$query_string';
access_log off;
access_log /dev/null main;
error_log /dev/null;
connection_pool_size 256;
client_header_buffer_size 4k;
client_max_body_size 600m;
large_client_header_buffers 8 32k;
request_pool_size 4k;
output_buffers 1 32k;
postpone_output 1460;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript text/x-javascript application/javascript;
gzip_disable «msie6»;
gzip_comp_level 6;
gzip_http_version 1.0;
gzip_vary on;
sendfile on;
aio threads;
directio 10m;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
keepalive_timeout 75 20;
server_names_hash_bucket_size 128;
server_names_hash_max_size 8192;
ignore_invalid_headers on;
server_name_in_redirect off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'AES128+EECDH:AES128+EDH';
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
ssl_trusted_certificate /etc/ssl/certs/ca-certs.pem;
spdy_headers_comp 1;
add_header Alternate-Protocol 443:npn-spdy/3;
add_header Strict-Transport-Security «max-age=63072000; includeSubdomains;»;
add_header X-Content-Type-Options nosniff;
proxy_buffering off;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_connect_timeout 300m;
proxy_read_timeout 300m;
proxy_send_timeout 300m;
proxy_store off;
proxy_ignore_client_abort on;
fastcgi_read_timeout 300m;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
proxy_cache_path /var/cache/nginx/page levels=2 keys_zone=pagecache:100m inactive=1h max_size=10g;
fastcgi_cache_path /var/cache/nginx/fpm levels=2 keys_zone=FPMCACHE:100m inactive=1h max_size=10g;
fastcgi_cache_key "$scheme$request_method$host";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
upstream memcached_backend { server 127.0.0.1:11211; }
real_ip_header X-Real-IP;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
allow all;
server {
listen 80 reuseport;
}
include /etc/nginx/conf.d/*.conf;
}
server {
listen *:80;
server_name habratest.livelinux.ru www.habratest.livelinux.ru;
root /var/www/habratest.livelinux.ru/web;
index index.html index.htm index.php index.cgi index.pl index.xhtml;
error_page 400 /error/400.html;
error_page 401 /error/401.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 405 /error/405.html;
error_page 500 /error/500.html;
error_page 502 /error/502.html;
error_page 503 /error/503.html;
recursive_error_pages on;
location = /error/400.html {
internal;
}
location = /error/401.html {
internal;
}
location = /error/403.html {
internal;
}
location = /error/404.html {
internal;
}
location = /error/405.html {
internal;
}
location = /error/500.html {
internal;
}
location = /error/502.html {
internal;
}
location = /error/503.html {
internal;
}
error_log /var/log/ispconfig/httpd/habratest.livelinux.ru/error.log;
access_log /var/log/ispconfig/httpd/habratest.livelinux.ru/access.log combined;
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location /stats/ {
index index.html index.php;
auth_basic «Members Only»;
auth_basic_user_file /var/www/clients/client1/web1/web/stats/.htpasswd_stats;
}
location ^~ /awstats-icon {
alias /usr/share/awstats/icon;
}
location ~ \.php$ {
try_files /70b2e8b422a0dce8501e61dafabafa26.htm php;
}
location php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
location / {
try_files $uri @rewrite;
}
location @rewrite {
rewrite ^ /index.php;
}
}
php-fpm:
[web1]
listen = /var/lib/php5-fpm/web1.sock
listen.owner = web1
listen.group = client1
listen.mode = 0660
user = web1
group = client1
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 0
chdir = /
php_admin_value[open_basedir] = /var/www/clients/client1/web1/web:/var/www/clients/client1/web1/private:/var/www/clients/client1/web1/tmp:/var/www/habratest.livelinux.ru/web:/srv/www/habratest.livelinux.ru/web:/usr/share/php5:/usr/share/php:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin
php_admin_value[session.save_path] = «tcp://localhost:11211»
php_admin_value[upload_tmp_dir] = /var/www/clients/client1/web1/tmp
php_admin_value[sendmail_path] = "/usr/sbin/sendmail -t -i -fwebmaster@habratest.livelinux.ru"
MariaDB:
Server version: 10.0.21-MariaDB MariaDB Server
[mysqld]
symbolic-links=0
default_storage_engine = InnoDB
innodb_file_per_table = 1
event_scheduler=on
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
connect_timeout = 600000
wait_timeout = 28800
max_connections = 600
max_allowed_packet = 512M
max_connect_errors = 10000
net_read_timeout = 600000
connect_timeout = 600000
net_write_timeout = 600000
innodb_open_files = 512
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2
innodb_file_format = barracuda
innodb_locks_unsafe_for_binlog = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
transaction-isolation = READ-COMMITTED
innodb-data-file-path = ibdata1:10M:autoextend
innodb-log-file-size = 256M
innodb_log_buffer_size = 8M
skip-name-resolve
skip-external-locking
skip-innodb_doublewrite
query_cache_size = 128M
query_cache_type = 1
query_cache_min_res_unit = 2K
join_buffer_size = 8M
read_rnd_buffer_size = 3M
table_definition_cache = 2048
table_open_cache = 2048
thread_cache_size = 128
tmp_table_size = 200M
max_heap_table_size = 200M
log_error = /var/log/mysql/mysql-error.log
key_buffer_size = 256M
optimizer_switch='derived_merge=off,derived_with_keys=off'
Как будем тестировать?
В текущем сервере, установлен zabbix-prox и его задачи каждую минуту:
- Открывать главную страницу испытуемого сайта, дожидаться определенного содержимого на странице, убеждаться, что ответ от сервера — код 200.
- Следующим шагом идет авторизация в админку сайта, это происходит отправкой соответсвующего POST запроса. Сверка текста и кода ответа на странице с заложенным эталоном. Этот шаг касается почти всех подсистем web-сервера, и во многом его скорость зависит от скорости взаимодействия с базой данных
- Последним шагом является выход из админки сайта, сверка кода ответа и текста на странице выхода
- По итогам каждого шага, zabbix будет скрупулезно замерять и записывать скорость рендеринга php-кода в html понятный браузеру и демонстрировать нам графики полученных результатов
- Для каждого испытуемого будут записываться значения в течение одного часа и в качестве результата будет выступать средние значения за этот час
- Скорость измеряется в KBps (килобайт в секунду), а отклик в ms (миллисекундах)
- Тестирование будет с того же сервера, при обращении через localhost, так что влияние на результат скорости интернет-соединения исключено
Тестирование:
Сравнение скорости интерпретации страницы и времени отклика, для всех версий PHP, без использования оптимизаторов:
Чем выше результат (KBps), тем лучше
Чем ниже результат (ms), тем лучше
Сравнение скорости интерпретации страницы и времени отклика, для всех версий PHP, с использованием Opcache:
Чем выше результат (KBps), тем лучше
Чем ниже результат (ms), тем лучше
Сравнение скорости интерпретации страницы и времени отклика, PHP54, с использованием APC, xCache и Opcache
Чем выше результат (KBps), тем лучше
Чем ниже результат (ms), тем лучше
Сравнение скорости интерпретации страницы и времени отклика, PHP53, с использованием APC, xCache и Opcache
Чем выше результат (KBps), тем лучше
Чем ниже результат (ms), тем лучше
По вопросам сотрудничества, мои контакты в профиле
Комментарии (37)
igordata
14.08.2015 20:52Статья оформлена на голову лучше, чем предыдущая, хотя конечно я всё равно остаюсь при мнении, что Zabbix ни разу не писькомерка, а 60 запросов — мало, а единицы измерения не указаны ни на одном из графиков.
А что такое показатель «интерпретации страницы и времени отклика… Чем выше результат, тем лучше»? Это что за попугаи?
Также прошу автора пояснить причины особенности своей методики проведения замеров, которые заставляю его делать 60 замеров в час. Откуда эта странная идея? Чем она вызывана?
andreili
14.08.2015 21:42+1Свой сайт попробовали запустить на PHP7 вместо HHVM (в версии под последнюю багу искали).
результат — на чистом ПХП7 с кэшами сайт уделал версию на HHVM почти в 2 раза по всем параметрам…
Посещаемость сайта — в среднем 11к уникальных пользователей, около 60Гб исходящего траффика и 90к посещений страниц в сутки.Fesor
14.08.2015 22:01уделал версию на HHVM почти в 2 раза по всем параметрам…
Как-то сомнительноandreili
14.08.2015 23:58Но факт…
Переписки с тестами сайта, к сожалению, не осталось :(
Тестирование проводилось siege объемом 10к запросов (по примерно 300 случайных линков).Fesor
15.08.2015 01:14что-то как-то очень сомнительно, PHP7 кое-как догоняет по производительности HHVM только, если он его рвет в нагрузочных тестах, стало быть у нас был хреново настроенный HHVM против настроенного PHP-FPM. Я с HHVM не особо работал (только для cli юзаю иногда) и не вкурсе как там чего с настройками… в голову приходит только то что в fpm больше воркеров стало и утилизировать ресурсы системы стало лучше.
E_STRICT
14.08.2015 22:23Примерно совпадает с этими бенчмарками.
www.zend.com/en/resources/php7_infographic
forgotten
17.08.2015 09:24Я правильно понимаю, что мерили ту самую CMS-ку, у которой главная страница изкоробки делает 80-сколько-то-там запросов в базу?
SyCraft
17.08.2015 10:15Она довольно активно работает с базой, но про 80 запросов из коробки не уверен.
Есть где почитать?
судя по трейсу кода, это не так. Кроме того, запросы к базе происходят через модуль mysql или mysqli
Они так же часть php и скорость их работы в фокусе этого теста.Fesor
17.08.2015 11:17drupal разве не через PDO работает? Там свои драйвера над mysqli?
SyCraft
17.08.2015 11:28а pdo это не модуль php?
PHP Data Objects (PDO) – расширение, определяющее облегченный, единый интерфейс для доступа к базам данных в PHP. Каждый драйвер базы данных, который реализует интерфейс PDO, может предоставить определенные для базы данных функции как обычные функции расширения. Обратите внимание, что Вы не можете выполнить функции базы данных, используя расширение PDO отдельно; Вы должны использовать определенный для базы данных драйвер PDO, чтобы обратиться к серверу базы данных.
Fesor
17.08.2015 12:42ну кроме того что существует огромная разница между pdo и mysqli… Ибо если рассуждать без учета различий — все есть php модуль на определенном уровне реализации.
SyCraft
17.08.2015 12:58Вот именно, потому и происходит сравнение на одинаковой конфигурации drupal. C одинаковым модульем работы с базой.
igordata
17.08.2015 23:02Это вообще не имеет значения в контексте статьи. Какая разница? =) Вопросы игнорировать некрасиво.
igordata
17.08.2015 11:29-1А не всё ли равно?
forgotten
19.08.2015 09:54Неясно, зачем мерять производительность PHP на проекте, который заведомо при росте нагрузки упирается в базу, а не фронт.
Fesor
19.08.2015 11:25В любом случае если выполнение PHP занимает 50% времени и php7 почти в 2 раза быстрее, мы всеравно получаем приблизительно 30% прирост производительности, что как по мне не мало. Да и в рамках тестов взаимодействие с базой все же было, так что все учтено.
forgotten
19.08.2015 11:27-1Прирост производительности 30% при конкретном тестовом размере базы.
Сколько он будет на реальном нагруженном проекте? Хорошо если 3% наберётся.SyCraft
19.08.2015 11:31При равном размере баз и прочих условиях, отичаются только интерпретаторы php
те на скорость в тесте влияют только испытуемые.
Fesor
19.08.2015 11:32+1Хорошо если 3% наберётся.
Да, давайте кидаться цифрами из головы. Для среднестатистического проекта на друпале не будет такой нагрузки на базу что работа СУБД займет более 50% времени обработки запроса.SyCraft
19.08.2015 11:47Если такой найдется, то явно никакая магия и смена php проекту не поможет.
Fesor
19.08.2015 11:52Обычно на этих проектах есть разработчики, которые думаю догадаются оптимизировать базу (возможно памяти для индексов не хватает или кривой плагин не добавил эти самые индексы), добавить кэш и т.д. Не все люди тупые (надеюсь). А показать что PHP7 быстрее и сильно быстрее PHP5.6 — это полезная информация. Возможно статья и сомнительна но доводы вроде «на больших нагрузках все будет плохо если брать инструменты для этого не предназначенные as is» это глупо.
evilbot
Исследование подтверждает мысль о том, что можно пользоваться любым поддерживаемым PHP. По скорости они примерно одинаковы.
Fesor
Ну как бы да, вот только поддержка 5,4 заканчивается через месяц.
evilbot
Это повод экстренно заняться адаптацией своих приложений на 5.5. :)
E_STRICT
PHP 5.5 обрато совместим с PHP 5.4 (почти). Да и PHP 5.6 тоже не далеко ушёл.