Установка PHP 7 в Ubuntu

Дата: 24.01.2016Метки: ,

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

Установка PHP 7 в Ubuntu

На данный момент PHP 7 официально не доступен для установки в Ubuntu. Но мы можем установить PHP 7 в Ubuntu используя PPA — персональный репозиторий apt, размещенный на сайте Launchpad. С помощью PPA сторонние разработчики имеют возможность создавать и распространять пакеты для Ubuntu за пределами официальных каналов.

С помощью команды ниже добавьте репозиторий PHP 7 в Ubuntu:

add-apt-repository ppa:ondrej/php

После установки PPA, обновите локальный кэш пакетов:

apt-get update

Теперь у нас есть доступ к новым пакетам, мы можем выполнить установку PHP 7 в Ubuntu. В этой статье я опишу процесс настройки PHP 7 для использования его в связке с веб-сервером Nginx. Для этого нам потребуется установить PHP-FPM:

apt-get install php7.0-fpm

Если ваше скрипты используют в процессе работы MySQL, выполните команду:

apt-get install php7.0-mysql

Настройка PHP 7 для работы с Nginx

Процессы PHP 7 и Nginx взаимодействуют между собой с помощью unix-сокета. По умолчанию в PHP 7 unix-сокет имеет следующее расположение:

/var/run/php/php7.0-fpm.sock

Откройте конфигурационный файл default в текстовом редакторе nano:

nano /etc/nginx/sites-enabled/default

Полностью удалите все содержимое файла default, а заетем скопируйте строки из примера ниже:

server {
    listen 80 default_server;

    root /var/www/html;
    index index.php index.html;

    server_name _;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Закройте файл и сохраните изменения. Чтобы использовать новые настройки необходимо перезапустить Nginx:

nginx -t
service nginx restart

Проверка работы PHP 7

Чтобы проверить правильность установки и настройки PHP 7 в Ubuntu, в коневом каталоге сайта создайте файл:

nano /var/www/html/info.php

Следующего содержания:

<?php
phpinfo();
?>

Откройте файл в вашем браузере:

http://server_ip/info.php

Если вы правильно установили и настроили PHP 7 в Ubuntu, вы должны увидеть страницу содержащую информацию о его конфигурации.

Установка PHP 7 в CentOS 7

Дата: 22.01.2016Метки: ,

Информация в данной записи немного устарела, рекомендую частично использовать информацию из статьи Веб-сервер на CentOS 7: Nginx, PHP 7.x, PerconaDB

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

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

На данный момент в официальном репозитории Cent OS 7 отсутствуют пакеты для установки PHP 7. Связи с чем, стоит немного повременить с переводом на PHP 7 серьезных коммерческих проектов. Зато будет не лишним установить PHP 7 на тестовый серевер, чтобы заранее проверить совместимость приложений и ознакомиться с новыми возможностями языка PHP 7.

В этой записи я опишу свой опыт установки PHP 7 для использования его в сочетании с веб-сервером Nginx. Для установки я использовал систему CentOS 7.1 и пакеты PHP 7 из неофициального репозитория IUS.

Установка PHP 7 в Cent OS 7

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

Переходим в каталог tmp и загружаем скрипт на сервер:

cd /tmp
curl 'https://setup.ius.io/' -o setup-ius.sh

Затем выполните скрипт командой:

bash setup-ius.sh

Если на сервере присутствует PHP, удалите все установленные пакеты. Для первой установки PHP 7 на сервере, следующий пункт нужно пропустить.

yum remove php-fpm php-cli php-common

Чтобы установить PHP 7 и модули php-fpm, php-mysqlnd, выполните команду:

yum install php70u-fpm-nginx php70u-cli php70u-mysqlnd

Я установил PHP 7 с минимальным набором модулей. В дальнейшем вы можете установить дополнительные модули по своему усмотрению. Если у вас процесс установки прошел без ошибок — я вас поздравляю. У меня же первый блин был комом, с первой попытки установить PHP 7 в CentOS мне не удалось. Подробнее описание решения проблемы вы можете прочитать в конце статьи.

Настройка PHP 7 для работы с Nginx

После завершения установки PHP 7, нам нужно внести изменения в конфигурацию PHP-FPM и Nginx. По умолчанию в PHP 7 для соединений использует локальный TCP-порт. Общеизвестным фактом является то, что для лучшего быстродействия PHP-FPM и Nginx желательно использовать Unix-сокет.

Используя PHP-FPM можно обрабатывать несколько пулов дочерних процессов. По умолчанию в PHP 7 сконфигурирован на использование одного общего пула WWW. Его настройки хранятся в файле /etc/php-fpm.d/www.conf. Откройте этот файл в текстовом редакторе:

nano /etc/php-fpm.d/www.conf

Закомментируйте строку listen = 127.0.0.1:9000, она отвечает за работу PHP-FPM через порт 9000. Вместо нее раскомментируйте строку listen = /run/php-fpm/www.sock расположенную ниже.

;listen = 127.0.0.1:9000
; WARNING: If you switch to a unix socket, you have to grant your webserver user
;          access to that socket by setting listen.acl_users to the webserver user.
listen = /run/php-fpm/www.sock

Затем найдите блок listen.acl_users и раскомментируйте в нем строку listen.acl_users = nginx.

; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users = apache,nginx
;listen.acl_users = apache
listen.acl_users = nginx
;listen.acl_groups =

Закройте файл и сохраните изменения. Теперь нам необходимо изменить конфигурацию Nginx, для того чтобы веб-сервер использовал сокет во время взаимодействия с PHP-FPM. Откройте файл:

nano /etc/nginx/conf.d/php-fpm.conf

Нам необходимо переключить способ взаимодействия Nginx и PHP-FPM с tcp-порта 9000 на использование сокета. Для этого измените содержимое файла следующим образом:

# PHP-FPM FastCGI server
# network or unix domain socket configuration

upstream php-fpm {
        #server 127.0.0.1:9000;
        server unix:/run/php-fpm/www.sock;
}

Закройте файл и сохраните изменения. Чтобы новые директивы вступили в силу нам необходимо перезапустить PHP-FPM и Nginx:

systemctl restart php-fpm
systemctl restart nginx

Вы можете проверить статус каждого сервиса, используя systemctl:

systemctl status php-fpm
systemctl status nginx

Проверка работы PHP 7

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

# php -v
PHP 7.0.1 (cli) (built: Dec 18 2015 16:35:26) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

Затем создадим в корневом каталоге веб-сервера файл info.php:

nano /usr/share/nginx/html/info.php

Скопируйте в файл следующий код:

<?php
phpinfo();

Закройте файл и сохраните изменения. Введите в браузере ip-адрес или доменное имя вашего сервера и укажите название файла info.php:

http://server_ip/info.php

Если вы правильно установили и настроили PHP 7 в CentOS, вы должны увидеть страницу содержащую информацию о конфигурации PHP 7.

Проблемы во время установки PHP 7

Далее я расскажу о небольшой проблеме, с которой я столкнулся во время установки PHP 7 на CentOS 7.1.

Error: Package: php70u-fpm-7.0.1-1.ius.centos7.x86_64 (ius)
           Requires: libsystemd.so.0()(64bit)
Error: Package: php70u-fpm-7.0.1-1.ius.centos7.x86_64 (ius)
           Requires: libsystemd.so.0(LIBSYSTEMD_209)(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Очень часто хостеры вносят свои изменения в шаблоны контейнеров виртуальных машин. В моем случае, проблема была вызвана тем, что CentOS 7 использовала кривые зеркала centos-base и testing репозиториев. Для тех, кто столкнулся с подобной проблемой, откройте файл:

nano /etc/yum.repos.d/CentOS-Base.repo

Чтобы устанавливать пакеты из официальных репозиториев CentOS 7, используйте конфигурацию ниже:

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Скрыть версию PHP и Nginx

Дата: 09.01.2016Метки: ,

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

Для примера с помощью этого сервиса я получил заголовок ответа веб-сервера для первого попавшегося сайта:

Server: nginx/1.9.5
Content-Type: text/html; charset="UTF-8"
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Set-Cookie: PHPSESSID=bsi4talrrugln1btgfen1mjmj3;
expires="Sun, 08-Jan-2017 19:27:38 GMT"; Max-Age=31536000;
path=/
Cache-Control: no-cache
Date: Sat, 09 Jan 2016 19:27:38 GMT
Content-Encoding: gzip

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

Чтобы скрыть версию PHP, измените значение параметра expose_php в файле php.ini:

expose_php = off

Чтобы скрыть версию Nginx, необходимо добавить в секцию http следующий параметр:

server_tokens off;

Не забудьте перезапустить PHP и Nginx, для того чтобы изменения вступили в силу.

Установка PHP 7 с Dotdeb

Дата: 08.12.2015Метки: ,

Буквально на днях в репозиториях Dotdeb появился пакет финальной версии PHP 7. Многие жалуются на Dotdeb, но у меня никогда проблем с пакетами установленными из Dotdeb не возникало. В этой записи я опишу установку PHP7 в связке с Nginx. Вы можете ознакомится с информацией о установке PHP7 для Apache2 в следующей моей записи.

Для установки PHP 7 в Debian сначала необходимо добавить репозиторий в систему. Для этого откройте файл:

/etc/apt/sources.list

Затем добавьте в него следующие строки:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Скачиваем и устанавливаем ключ GnuPG:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Выполните команду:

apt-get update

Установить PHP 7:

apt-get install php7.0-fpm

Для управления PHP 7, используем команды:

service php7.0-fpm start
service php7.0-fpm stop
service php7.0-fpm restart

Установка PHP 7 в Debian 8

Дата: 08.12.2015Метки: ,

Совсем недавно вышла финальная версия PHP 7.0.0, а это значит, что разработка достигла своего финала и пора обновить инструкцию по установке PHP 7 в Debian. Процесс сборки PHP 7 выполнялся из исходников под OS Debian 8.

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

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

Для начала установим все необходимые для сборки и работы PHP 7 зависимости:

apt-get install build-essential autoconf re2c bison libssl-dev libcurl4-openssl-dev pkg-config libpng-dev libxml2-dev libxml2 libcurl3

Указанные выше зависимости составлены исходя из указанных мной модулей PHP 7. Если вы хотите добавить другие модули, возможно, понадобиться дополнительно установить необходимые для сборки пакеты. Иначе в процессе выполнения команды ./configure вы получите ошибку.

Установка PHP 7

Все действия будем выполнять в директории:

cd /usr/src

Скачиваем и распаковываем исходники PHP 7.0.4:

wget http://de1.php.net/get/php-7.0.4.tar.bz2/from/this/mirror -O php-7.0.4.tar.bz2
tar -xvjf php-7.0.4.tar.bz2

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

Переходим в каталог с исходниками PHP 7:

cd php-7.0.4

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

./buildconf --force

CONFIGURE_STRING="--prefix=/usr/local/php-fpm 
--enable-fpm
--enable-mysqlnd
--enable-mbstring
--disable-pdo
--disable-phar
--with-config-file-scan-dir=/usr/local/php-fpm/etc/conf.d
--with-curl
--with-gd
--with-fpm-user=www-data
--with-fpm-group=www-data
--with-mysql-sock=/var/run/mysqld/mysqld.sock
--with-mysqli=mysqlnd
--with-zlib
--without-sqlite3
--without-pdo-sqlite"

Если вы планируете использовать на вашем сервере Apache, к указанным выше параметрам необходимо добавить:

--with-apxs2

Данная конфигурация проверена мной и протестирована на WordPress 4.4.2 с минимальным набором плагинов. Если вы хотите добавить в PHP 7 другие модули, найдите их в списке доступных параметров сборки:

./configure --help

Для компиляции и установки PHP 7, необходимо выполнить команду:

./configure $CONFIGURE_STRING
make && make install

Настройка PHP 7

Если в процессе компиляции не было ошибок, файлы PHP 7 должны быть расположены в директории:

/usr/local/php-fpm

Нам осталось внести изменения в конфигурационный файлы и добавить PHP 7 в автозагрузку. Для начала скопируем файл php.ini из каталога с исходниками в каталог установки PHP 7:

cp /usr/src/php-7.0.4/php.ini-production /usr/local/php-fpm/lib/php.ini

Чтобы включить модуль Zend OPcache, создайте файл:

mkdir -p /usr/local/php-fpm/etc/conf.d/
nano /usr/local/php-fpm/etc/conf.d/modules.ini

Скопируйте в него следующие параметры:

# Zend OPcache
zend_extension=opcache.so

Для настройки работы PHP-FPM создайте файл:

nano /usr/local/php-fpm/etc/php-fpm.conf

И добавьте в него следующие параметры:

[global]

pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log

include=/usr/local/php-fpm/etc/php-fpm.d/*.conf

Затем создайте файл:

nano /usr/local/php-fpm/etc/php-fpm.d/www.conf

И добавьте в него параметры:

[www]
user = www-data
group = www-data

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0777

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Добавим PHP 7 в автозагрузку, создадим символическую ссылку на файл php-fpm:

ln -s /usr/local/php-fpm/sbin/php-fpm /usr/local/php-fpm/sbin/php7-fpm

Я предпочитаю запускать все процессы через systemd. Создадим новый юнит:

nano /etc/systemd/system/php-fpm/php-fpm.service

Добавим в содержимое файла:

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php-fpm/var/run/php-fpm.pid
ExecStart=/usr/local/php-fpm/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-fpm/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Включаем, запускаем и смотрим статус юнита:

systemctl enable php-fpm
systemctl start php-fpm
systemctl -l status php-fpm

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

Альтернативный метод запуска php_fpm. Менее надежен, если процесс упадет, то восстановить его работу необходимо будет вручную. Пропускаем этот этап, если ранее настроили запуск PHP через systemd. Создадим в каталоге init.d скрипт для запуска PHP-FPM:

nano /etc/init.d/php-fpm

Добавьте в содержимое файла:

Дадим права на запуск, добавим скрипт в автозагрузку:

chmod +x /etc/init.d/php-fpm
update-rc.d php-fpm defaults

Затем необходимо выполнить команду:

service php-fpm restart

Для работы PHP-FPM в Nginx, добавьте в секцию server виртуального хоста:

location ~ .php$ {
    try_files $uri = 404;
    fastcgi_pass unix:/var/run/php-fpm7.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Проблемы в процессе установки PHP 7

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

./buildconf: 46: ./buildconf: make: not found

# Выполните установку:
apt-get install build-essential
buildconf: autoconf not found.
           You need autoconf version 2.59 or newer installed
           to build PHP from Git.
build/build.mk:37: recipe for target 'buildmk.stamp' failed

# Выполните установку:
apt-get install autoconf
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.

# Выполните установку:
apt-get install re2c
configure: error: bison is required to build PHP/Zend when building a GIT checkout!

# Выполните установку:
apt-get install bison
configure: error: Cannot find OpenSSL's 

# Выполните установку:
apt-get install libssl-dev libcurl4-openssl-dev pkg-config
configure: error: png.h not found.

# Выполните установку:
libpng-dev
configure: error: xml2-config not found. Please check your libxml2 installation.

# Выполните установку:
apt-get install libxml2 libxml2-dev

Установить модуль PhpRedis для PHP 7

Дата: 12.11.2015Метки: ,

Для использования Redis в PHP необходимо использовать дополнительные модули, либо такие php-библиотеки как Predis. С точки зрения скорости, более предпочтителен первый вариант. По моему опыту, производительность сервера PHP 7 в сочетании с модулем PhpRedis примерно в два раза выше по сравнению с использованием для этих целей библиотеки Predis.

Информацию по установке PHP 7 в Debian можно прочитать в этой статье. В данной записи речь пойдет о том как установить модуль PhpRedis для PHP 7. Мне не удалось найти PhpRedis в виде готового для использования в PHP 7 модуля. Поэтому, чтобы установить PhpRedis, придется собирать модуль из исходников. Для этого скачиваем исходники с репозитория GitHub:

cd /usr/src
wget https://github.com/edtechd/phpredis/archive/php7.zip

Распаковываем содержимое архива:

unzip php7.zip

Переходим в содержимое директории:

cd /usr/src/phpredis-php7

Если вы хотите хранить в базе Redis такие файлы как изображения или сжатые GZIP страницы, вам необходима поддержка модулем сериализации. Для этого понадобится библиотека igbinary.h.

mkdir /usr/src/phpredis-php7/ext
cd /usr/src/phpredis-php7/ext
wget https://github.com/igbinary/igbinary/archive/php7-dev-playground2.zip
unzip php7-dev-playground2.zip
mv igbinary-php7-dev-playground2 igbinary
cd /usr/src/phpredis-php7

С помощью команды phpize, необходимо выполнить подготовку окружения PHP-расширения:

phpize

В моем случае PHP 7 был установлен из исходников, поэтому необходимо указать полный путь:

/usr/local/php7/bin/phpize

Если вы не знаете расположение файла, его можно найти с помощью команды:

find -name phpize

Далее выполним команду:

./configure

В процессе я получил следующую ошибку:

Cannot find php-config. Please use --with-php-config=PATH

Пользуясь поиском, находим расположение файла php-config. В моем случае, файл расположен по следующему пути /usr/local/php7/bin/php-config. Затем повторно выполним команду:

./configure --with-php-config=/usr/local/php7/bin/php-config 
--enable-redis-igbinary

Выполним компиляцию модуля PhpRedis:

make

Далее необходимо вручную скопировать файл redis.so в каталог модулей PHP. А затем указать путь к файлу. Следует отметить, что расположения файлов и директорий указанных ниже, может отличаться от ваших.

cp modules/redis.so /usr/local/php7/modules

Указываем путь к файлу модуля в файле php.ini:

extension=/usr/local/php7/modules/redis.so

Чтобы применить настройки перезапусти PHP-FPM:

service php7-fpm restart

Используем Redis для кэширования WordPress

Использование Redis для хранения кэша страниц WordPress является хорошей альтернативной использованию fastcgi_cache в Nginx. Для работы кэша нам необходимо установить Redis сервер и немного изменить настройки хоста в Nginx. За выполнения функции кэширования будет отвечать специальный PHP-скрипт.

Для работы скрипта необходимо наличие на сервере установленного PHP-модуля PhpRedis. Модуль можно собрать из исходников, либо установить в Debian напрямую из deb пакета с помощью команды apt-get. Данный вариант подходит в том случае, если вы используете на вашем сервере PHP5.

На своем сервере я использую PHP7. Несмотря на все мои попытки, собратьPphpRedis для работы в PHP7 мне так и не удалось. Поэтому, в качестве альтернативы для работы с сервером Redis я буду использовать PHP библиотеку Predis. Для тех кто хочет поэкспериментировать, вот ссылка на ветку PhpRedis для PHP7.

Скачать скрипт кеширования можно c репозитория на сайте GitHub. Необходимо скопировать все файлы в корневую директорию сайта. Для работы кешировани необходимо в конфигурацию виртуальнго хоста Nginx добавить следующие строки:

server {
    listen 80;

    server_name localhost;
    root /usr/share/nginx/html;
   
    index index.php;

    location /index.php {
        alias /www/codebeer.ru/wordpress/wp-cache.php;
    }

    location / {
        index wp-cache.php;
        try_files $uri $uri/ /wp-cache.php?$args;
    }

    location /wp-admin/ {
        index index.php;
        try_files $uri $uri/ /index.php$args;
    }

    rewrite /wp-admin$ $scheme::/$host$uri/ permanent;

    location ~ .php$ {
        try_files $uri = 404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

PHP: Удалить параметр из URL

Дата: 06.11.2015Метки:

Часто возникает задача обработки GET-запроса, содержащегося в строке URL. В данной записи приведу пример небольшой функции для обработки адреса страницы, в которой содержится определенный набор параметров. Функция из примера ниже позволяет удалить заданный параметр из строки URL.

Для примера, нам необходимо удалить параметр id из URL следующего вида:

http://codebeer.ru/?p=1&id=1

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

http://codebeer.ru/?p=1

Для этого будем использовать функцию:

function remove_key($key) {
    parse_str($_SERVER['QUERY_STRING'], $vars);
    $url = strtok($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], '?') . http_build_query(array_diff_key($vars,array($key=>"")));
    return $url;
}

echo remove_key('id');

Сели необходимо полностью удалить все параметры из строки запроса, удобно использовать:

strtok($url, '?')

Установка PHP 7 из исходников в Debian

Дата: 12.09.2015Метки:

Материал устарел, для установки PHP 7 читайте Установка PHP 7 в Debian 8.

Существенным аргументом в ползу перехода на PHP 7 является значительное увеличение производительности. Несмотря на отсутствие встроенного JIT-компилятора, в большинстве тестов PHP 7 удалось обогнать по производительности HHVM — транслятор исходного кода, специально созданный компанией Facebook для высокой производительности с целью экономии ресурсов серверов.

На протяжении разработки PHP 5, разработчикам с каждой новой версией удавалось добиться увеличения производительности. Но ближе к PHP 5.5 дальнейшее развитие сдерживала система выделения и освобождения памяти. В течении около пяти месяцев велась работа по рефрактору и изменению ядра, результаты работы получили кодовое имя phpng, так же известном как Zend Engine 3.

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

Для начала нам необходимо установить все необходимые для сборки PHP 7 пакеты:

apt-get install git-core cmake gawk libmysqlclient-dev 
  libxml2-dev libmcrypt-dev libicu-dev openssl build-essential binutils-dev 
  libcap-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev 
  autoconf libtool libcurl4-openssl-dev wget memcached 
  libreadline-dev libncurses5-dev libmemcached-dev libbz2-dev 
  libc-client2007e-dev php5-mcrypt php5-imagick libgoogle-perftools-dev 
  libcloog-ppl-dev libelf-dev libdwarf-dev libunwind8-dev subversion 
  libtbb2 g++-4.8 gcc-4.8 libjemalloc-dev 
  libc6-dev libmpfr4 libgcc1 binutils 
  libc6 libc-dev-bin libc-bin libgomp1 
  libstdc++-4.8-dev libstdc++6 
  libarchive13 cmake-data libacl1 libattr1 
  g++ cpp gcc make libboost-thread1.55.0 
  libboost-thread-dev libgd2-xpm-dev 
  pkg-config libboost-system1.55-dev libboost-context1.55-dev 
  libboost-program-options1.55-dev libboost-filesystem1.55-dev libboost-regex1.55-dev 
  libmagickwand-dev libiberty-dev libevent-dev libxslt-dev libgoogle-glog-dev 
  automake libldap2-dev libkrb5-dev libyaml-dev gperf ocaml-native-compilers 
  libgmp-dev libgmp3-dev
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h

Скачиваем и распаковываем исходники PHP 7:

mkdir /tmp/php7 && cd /tmp/php7
wget https://downloads.php.net/~ab/php-7.0.0RC2.tar.gz
tar -xzf php-7.0.0RC2.tar.gz
mv php-7.0.0RC2 php-src

Минимальный набор компонентов PHP 7, необходимый для работы WordPress:

cd php-src
./buildconf --force
CONFIGURE_STRING="--prefix=/usr/local/php7 
--enable-fpm 
--enable-mysqlnd 
--enable-mbstring 
--enable-sockets 
--disable-ipv6 
--with-config-file-scan-dir=/usr/local/php7/etc/conf.d 
--with-curl 
--with-gd 
--with-fpm-user=www-data 
--with-fpm-group=www-data 
--with-mysql-sock=/var/run/mysqld/mysqld.sock 
--with-mysqli=mysqlnd 
--with-openssl 
--with-zlib 
--without-sqlite3 
--without-pdo-sqlite"

Компилируем PHP 7:

mkdir /usr/local/php7
./configure $CONFIGURE_STRING
make && make install

Создаем каталог для конфигурационных файлов PHP 7:

mkdir /usr/local/php7/etc/conf.d

Создаем символическую ссылку php-fpm для php7-fpm

ln -s /usr/local/php7/sbin/php-fpm /usr/local/php7/sbin/php7-fpm

Добавляем конфигурационные файлы:

cd /tmp/php7
cp php-src/php.ini-production /usr/local/php7/lib/php.ini
# nano /usr/local/php7/etc/php-fpm.d/www.conf

[www]

user = www-data
group = www-data

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
# nano /usr/local/php7/etc/php-fpm.conf

[global]

pid = /var/run/php7-fpm.pid
error_log = /var/log/php7-fpm.log

include=/usr/local/php7/etc/php-fpm.d/*.conf
# mkdir /usr/local/php7/etc/conf.d/
# nano /usr/local/php7/etc/conf.d/modules.ini

# Zend OPcache
zend_extension=opcache.so

Добавляем PHP-FPM в автозагрузку:

# nano /etc/init.d/php7-fpm

#!/bin/sh
### BEGIN INIT INFO
# Provides:          php7-fpm
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php7-fpm
# Description:       Starts The PHP FastCGI Process Manager Daemon
### END INIT INFO

# Author: Ondrej Sury <ondrej@debian.org>
# Adjusted for PHP7 by Kaspars Dambis <hi@kaspars.net>

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/php7/sbin
DESC="PHP7 FastCGI Process Manager"
NAME=php7-fpm
DAEMON=/usr/local/php7/sbin/$NAME
CONFFILE=/usr/local/php7/etc/php-fpm.conf
DAEMON_ARGS="--daemonize --fpm-config $CONFFILE"
CONF_PIDFILE=$(sed -n 's/^pid[ =]*//p' $CONFFILE)
PIDFILE=${CONF_PIDFILE:-/var/run/php7-fpm.pid}
TIMEOUT=30
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Don't run if we are running upstart
if init_is_upstart; then
    exit 1
fi

#
# Function to check the correctness of the config file
#
do_check()
{
    # Run php-fpm with -t option to check the configuration file syntax
    errors=$($DAEMON --fpm-config $CONFFILE -t 2>&1 | grep "[ERROR]" || true);
    if [ -n "$errors" ]; then
        echo "Please fix your configuration file..."
        echo $errors
        return 1
    fi
    return 0
}

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null 
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- 
		$DAEMON_ARGS 2>/dev/null 
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

case "$1" in
    start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_check $VERBOSE
	case "$?" in
	    0)
		do_start
		case "$?" in
		    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	    1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
    stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
    status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
    check)
        do_check yes
	;;
    reload|force-reload)
	log_daemon_msg "Reloading $DESC" "$NAME"
	do_reload
	log_end_msg $?
	;;
    reopen-logs)
	log_daemon_msg "Reopening $DESC logs" $NAME
	if start-stop-daemon --stop --signal USR1 --oknodo --quiet 
	    --pidfile $PIDFILE --exec $DAEMON
	then
	    log_end_msg 0
	else
	    log_end_msg 1
	fi
	;;
    restart)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
    *)
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
	exit 1
    ;;
esac

:
chmod +x /etc/init.d/php7-fpm
update-rc.d php7-fpm defaults

Для работы PHP-FPM через сокет необходимо необходимо внести изменения в файл:

nano /usr/local/php7/etc/php-fpm.d/www.conf

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

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Для запуска PHP7-FPM необходимо выполнить следующую команду:

service php7-fpm start