В этом конкретном посте мы продемонстрируем решение для установки нескольких версий Phalcon и PHP и запуска их на одном веб-сервере. Здесь будут использоваться PHP 5.5.x и 5.6.x, но вы можете заменить их другими версиями. Любых серверов, поддерживающих PHP-FPM, должно быть достаточно, но мы рекомендуем использовать Nginx. Средой, используемой в этом руководстве, является Fedora OS — система Linux, но инструкции практически идентичны для любой другой * nix ОС.
Предварительное примечание
В этом руководстве рассматривается установка PHP 5.5.x с Phalcon 1.3.x и PHP 5.6.x с Phalcon 2.0.0. Мы также создадим несколько дополнительных расширений PHP, таких как APC, memcache, memcached и ioncube.
Установка Nginx
Nginx — это доступный пакет в ОС Fedora, который мы можем установить следующим образом:
sudo yum install nginx
Затем мы создаем системные загрузочные ссылки для Nginx и запускаем его.
sudo chkconfig nginx on
sudo service nginx start
Сборка PHP
Перед тем, как начать с PHP, нам нужно установить предварительные условия для сборки PHP5:
- gcc или какой-то другой набор компиляторов.
- libc-dev, предоставляет стандартную библиотеку C, включая заголовки.
- make, который является инструментом управления сборкой, который использует PHP.
- autoconf (2.59 или выше) для генерации скрипта настройки.
- automake (1.4 или выше), генерирует файлы Makefile.in.
- libtool, помогает нам управлять общими библиотеками.
- бизон (2.4 или выше), для генерации парсера PHP.
- (необязательно) re2c, который используется для генерации лексера PHP. Поскольку репозиторий git уже содержит сгенерированный лексер, вам понадобится re2c, только если вы хотите внести в него изменения.
На Centos / Fedora вы можете установить все это с помощью следующей команды:
sudo yum install gcc libxml2-devel libXpm-devel gmp-devel libicu-devel t1lib-devel aspell-devel openssl-devel bzip2-devel libcurl-devel libjpeg-devel libvpx-devel libpng-devel freetype-devel readline-devel libtidy-devel libxslt-devel libmcrypt-devel pcre-devel curl-devel mysql-devel ncurses-devel gettext-devel net-snmp-devel libevent-devel libtool-ltdl-devel libc-client-devel postgresql-devel bison gcc make
Затем нам нужно получить его исходный код. Есть два способа сделать это: вы можете скачать архив со страницы загрузки PHP или клонировать репозиторий git из Github .
Мы рекомендуем проверить исходный код из git, поскольку он предоставляет вам простой способ поддерживать вашу установку в актуальном состоянии и пробовать ваш код в разных версиях. Git Checkout также требуется, если вы хотите отправить исправления или получить запросы на PHP.
Чтобы клонировать репозиторий, выполните следующие команды в своем терминале:
sudo mkdir /opt/source && cd /opt/source
git clone [email protected]:php/php-src.git && cd php-src
По умолчанию вы находитесь в основной ветке, поэтому, если вы хотите перейти на версию разработки, вам нужно проверить стабильную ветку. Например.
PHP 5.3: git checkout PHP-5.3
PHP 5.4: git checkout PHP-5.4
PHP 5.6: git checkout PHP-5.6
PHP HEAD: git checkout master
Прежде чем перейти к отдельным шагам сборки, мы должны выполнить некоторые команды для сборки PHP по умолчанию. Это необходимо только для сборок из git.
sudo ./buildconf
./buildconf
Это займет несколько минут.
На мой взгляд, лучше всего хранить весь веб-сервер в одном каталоге, поэтому я использую /opt
Откройте терминал и введите следующую команду.
sudo mkdir -p /opt/php-5.6
sudo mkdir -p /opt/php-5.5
После того, как сценарий ./configure
Вы можете перечислить все поддерживаемые параметры, используя –help:
./configure --help
В приведенной выше команде будут перечислены различные общие параметры, которые поддерживаются всеми сценариями конфигурации на основе autoconf. Один из них уже упомянут — –prefix = DIR, который изменяет каталог установки, используемый make install
Другой полезный параметр — -C, который кеширует результаты различных тестов в файле config.cache и ускоряет последующие вызовы ./configure
Использование этой опции имеет смысл, только если у вас уже есть работающая сборка и вы хотите быстро переключаться между различными конфигурациями.
Вот несколько полезных настроек:
[...]
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]
[...]
После завершения подготовки мы устанавливаем версию PHP 5.6. Запустите следующее:
./configure \
--prefix=/opt/php-5.6 \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-libdir=lib64 \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-gd \
--with-jpeg-dir=/usr/lib/
--enable-fpm
Последний ключ (–enable-fpm) заставляет эту версию PHP работать с PHP-FPM. Если вы хотите использовать эту версию PHP-FPM с Apache, используйте --with-fpm-user=apache
--with-fpm-group=apache
С другой стороны, если вы хотите использовать эту версию PHP-FPM с nginx, используйте --with-fpm-user=nginx
--with-fpm-group=nginx
Успешное сообщение должно быть напечатано в терминале следующим образом:
[...]
creating libtool
appending configuration tag "CXX" to libtool
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+
Thank you for using PHP.
config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
Теперь вы можете использовать make для выполнения фактической компиляции:
make
Основным результатом этой операции будут двоичные файлы PHP для включенных SAPI (по умолчанию sapi / cli / php и sapi / cgi / php-cgi), а также общие расширения в каталоге modules /.
Теперь вы можете запустить «make install» для установки PHP в / usr / local (по умолчанию) или в другие каталоги, используя конфигурацию --prefix
В этом случае это /opt/php-5.6
sudo make install
Обратите внимание, что make install
/opt/php-5.6/bin/php --ini
Configuration File (php.ini) Path: /opt/php-5.6/lib
Loaded Configuration File: (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
Скопируйте php.ini и php-fpm.conf в правильный каталог:
sudo cp /opt/source/php-src/php-fpm.conf.default /opt/php-5.6/etc/php-fpm.conf
sudo cp /opt/source/php-src/php.ini-production /opt/php-5.6/lib/php.ini
Мы проверяем и проверяем версию php еще раз.
/opt/php-5.6/bin/php --ini
Configuration File (php.ini) Path: /opt/php-5.6/lib
Loaded Configuration File: /opt/php-5.6/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
### Checking php
/opt/php-5.6/bin/php --version
PHP 5.6.2-dev (cli) (built: Oct 2 2014 17:20:23)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
Откройте /opt/php-5.6/etc/php-fpm.conf
Вы должны перейти на неиспользуемый порт (например, 9001; порт 9000 может использоваться Fedora)
vi /opt/php-5.6/etc/php-fpm.conf
[...]
pid = run/php-fpm.pid
[...]
user = nginx
group = nginx
[...]
listen = 127.0.0.1:9001
[...]
#include=/opt/php-5.6/etc/pool.d/*.conf
Настройка сценария инициализации
Возможно, вы захотите создать сценарий инициализации для вашего нового php-fpm. К счастью, PHP 5.3+ уже предоставляет его вам, просто скопируйте скрипт init в ваш каталог и измените разрешения:
sudo cp /opt/source/php-src/sapi/fpm/init.d.php-fpm /etc/init.d/php5.6-fpm
sudo chmod 755 /etc/init.d/php5.6-fpm
Ваш скрипт инициализации готов. Теперь вы можете запускать, останавливать и перезагружать php-fpm:
sudo /etc/init.d/php5.6-fpm start
sudo /etc/init.d/php5.6-fpm stop
sudo /etc/init.d/php5.6-fpm reload
Сборка второго PHP (5.5.x)
Открываем терминал и набираем следующую команду.
git checkout PHP-5.5
sudo ./buildconf
./configure \
--prefix=/opt/php-5.5 \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-libdir=lib64 \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-gd \
--with-jpeg-dir=/usr/lib/ \
--enable-fpm
make && sudo make install
Создание расширений PHP Phalcon
Чтобы установить несколько версий Phalcon, включая Phalcon 2.0, нам нужно установить Zephir.
git clone https://github.com/json-c/json-c.git
cd json-c
sh autogen.sh
./configure
make && sudo make install
git clone https://github.com/phalcon/zephir
cd zephir
sudo ./install -c
Есть много способов установить расширения PHP. Мы будем использовать phpize для сборки.
Phpize играет ту же роль, что и сценарий ./buildconf
$PREFIX/lib/php/build
Среди этих файлов acinclude.m4
phpize.m4
run-tests.php
Затем phpize вызовет autoconf
./configure
Например, при установке memcached вы должны добавить --enable-memcache
Помнить! Вы должны указать опцию --with-php-config
В противном случае ./configure
Кроме того, скрипт php-config также гарантирует, что команда «make install» переместит сгенерированный файл *.so
Сборка первого PHP Phalcon (2.0)
git clone http://github.com/phalcon/cphalcon
cd cphalcon && git checkout 2.0.0
zephir compile
cd ext && /opt/php-5.6/bin/phpize
./configure --with-php-config=/opt/php-5.6/bin/php-config
make && sudo make install
Installing shared extensions: /opt/php-5.6/lib/php/extensions/no-debug-non-zts-20131226/
Пожалуйста, проверьте, успешно ли это
ls /opt/php-5.6/lib/php/extensions/no-debug-non-zts-20131226/
После того, как расширение установлено. Вам все еще нужно активировать его, включив в файл php.ini.
sudo su
echo "extension=phalcon.so" >> /opt/php-5.6/lib/php.ini
exit
Сборка второго PHP Phalcon (1.3.x)
git clone http://github.com/phalcon/cphalcon
cd cphalcon && git checkout master
cd ext && /opt/php-5.5/bin/phpize
./configure --with-php-config=/opt/php-5.5/bin/php-config
make && sudo make install
Installing shared extensions: /opt/php-5.5/lib/php/extensions/no-debug-non-zts-20121212/
Мы проверяем снова, чтобы убедиться, что установка прошла успешно
ls /opt/php-5.6/lib/php/extensions/no-debug-non-zts-20131226/
sudo su
echo "extension=phalcon.so" >> /opt/php-5.5/lib/php.ini
exit
Настройка Nginx
sudo vi /etc/nginx/nginx.conf
Следующая конфигурация создаст два сервера: phalcon-prd.localhost работает на PHP 5.5.x и phalcon-dev.localhost работает с PHP 5.6.x. Это пример, вы можете настроить его на что угодно, см. Документацию Nginx
[...]
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
index index.php index.html index.htm;
#Prodution environment Phalcon
server {
listen 80;
server_name phalcon-prd.localhost;
root /usr/share/nginx/html/phalcon-prd;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
#Development environment Phalcon
server {
listen 80;
server_name phalcon-dev.localhost;
root /usr/share/nginx/html/phalcon-prd;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
[...]
Файл настройки локальных хостов
Если вы используете систему Linux, вы можете отредактировать файл хоста:
sudo vi /etc/hosts
Новый файл хоста будет выглядеть так.
[...]
127.0.0 localhost phalcon-dev.localhost phalcon-prd.localhost
::1 localhost6.localdomain6 localhost6
[...]
Этот перехватывает все запросы на phalcon-dev.localhost
phalcon-prd.localhost
Тестирование это
Для тестирования мы создаем новый файл с именем test.php и помещаем его в папку, соответствующую указанной выше конфигурации Nginx. В каждый файл мы добавляем следующую команду.
<?php phpinfo(); ?>
Теперь, запустив файл test.php
phpinfo()
http: //phancon-prd.localhost/test.php, а по адресу http: //phancon-dev.localhost/test. php должен быть phpinfo()
В заключение
Из этого руководства мы узнали, как легко иметь на своем сервере несколько активно работающих версий PHP, каждая из которых при необходимости имеет свой собственный набор различных расширений. Это может пригодиться, если вы пользуетесь виртуальным хостингом или если вам нужно поддерживать старые унаследованные приложения, в то время как вы можете разрабатывать и развертывать, например, на самых современных версиях.
Оставьте свой отзыв в комментариях ниже и, как всегда, поделитесь этой статьей, если она вам понравилась!