Статьи

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

В этом конкретном посте мы продемонстрируем решение для установки нескольких версий 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.m4phpize.m4run-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.localhostphalcon-prd.localhost

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

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

 <?php phpinfo(); ?>

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

В заключение

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

Оставьте свой отзыв в комментариях ниже и, как всегда, поделитесь этой статьей, если она вам понравилась!