В той статье мы продемонстрируем решение для установки нескольких версий 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 или выше) для генерации скрипта configure.
  • Automake (1.4 или выше), генерирует файлы Makefile.in.
  • Libtool, помогает нам управлять общими библиотеками.
  • Bison (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 сценария ./configure с помощью описанного выше шага вы можете использовать его для настройки сборки PHP. Вы можете просмотреть все поддерживаемые параметры, используя -help:

./configure --help

В приведенной выше команде будут перечислены различные общие параметры, которые поддерживаются всеми скриптами конфигурации на основе autoconf. Один из них уже упоминается -prefix = DIR, который меняет каталог установки, используемый командой make install . Другой полезной опцией является -C, которая кэширует результат различных тестов в файле config.cache и ускоряет ./configure вызовы ./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]
 
  [...]

После завершения подготовки мы устанавливаем версию 5.6 PHP. Выполните следующее:

./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 не будет создавать INI-файл.

/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 и /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

Настройка сценария Init

Вероятно, вы захотите создать сценарий инициализации для вашего нового 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 для PHP: во-первых, он импортирует систему сборки PHP в ваше расширение путем копирования файлов из $PREFIX/lib/php/build . Среди этих файлов: acinclude.m4 (макросы PHP M4), phpize.m4 (который будет переименован в файл configure.in в вашем расширении и содержит основные инструкции по сборке) и run-tests.php .

Затем phpize вызовет autoconf для создания файла ./configure , который можно использовать для настройки сборки расширения. Например, для установки memcached вы должны добавить --enable-memcache .

Запомните! Вы должны указать параметр --with-php-config при создании расширений (если у вас не используется ​​только одна глобальная установка PHP). В противном случае ./configure не сможет правильно определить версию PHP и флаги. Кроме того, скрипт 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. Это пример, вы можете настроить для своего сервера

[...]
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 а затем phalcon-prd.localhost передает их на ваш сервер.

Тестирование

Для тестирования мы создаем новый файл с именем test.php и помещаем его в папку, соответствующую указанной выше конфигурации Nginx. В каждый файл добавляется следующая команда.

<?php phpinfo(); ?>

Теперь, запустив файл test.php на каждом сервере, мы видим phalcon 1.3.x phpinfo() по адресу http: //phancon-prd.localhost/test.php, а в http: //phancon-dev.localhost/test. Php должен быть phpinfo() Phalcon 2.0.x.

несколько php на одном сервере

В заключение

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

Нужна установка нескольких версий php на сервер, обращайтесь [email protected]