# Как использовать несколько разных версий PHP без phpenv

Иногда требуется иметь несколько версий PHP - например, для разных проектов 
или для тестирования. Под linux с установкой нескольких версий проблем нет - например, для
Debian 8 доступны такие варианты: 

- использовать [утилиту phpenv](https://github.com/phpenv/phpenv), которая умеет 
скачивать исходники любой версии и собирать (компилировать) PHP из них, собирать
расширения для нужной версии. Эта программа работает не только под Debian и 
умеет переключать версии заменой переменных окружения. 
- подключить сторонний репозиторий с нексколькими версиями PHP, как описано тут 
<https://anton-pribora.ru/articles/nginx/debian-php5_6-and-php7_1/>. В этом случае 
будет доступно 2 исполняемых файла с названиями вроде php5.6 и php7.1, и с помощью
[команды update-alternatives](https://wiki.debian.org/ru/DebianAlternatives) можно 
выбрать, какой из них будет использоваться при вызове команды php без указания 
версии (update-alternatives просто создает символическую ссылку с 
/usr/bin/php на одну из версий). Этот вариант доступен только в определенных 
версиях Дебиана.

В случае использования второго варианта у нас нет возможности легко переключать
версии. Например, мы можем выполнить команду `php7.1 script.php`, но если `script.php` 
выполняет запуск команды php (вроде `exec "php --version"`), то может запуститься версия
PHP по умолчанию, а не та, которая нам нужна.

Исправить это можно таким образом: 

- создать где-нибудь пустую папку: `mkdir ~/php-71-bin/`
- создать в ней ссылку на нужную версию PHP под именем `php`, например: `ln -s /usr/bin/php71 ~/php-71-bin/`
- аналогично создать папки и символические ссылки для других версий
- написать и положить в `PATH` (например, в `/usr/local/bin/`) простой shell-скрипт, 
с именем php-71.sh, который задаст переменную `PATH` таким образом, чтобы первой 
находилась нужная нам версия PHP:

    ```sh
    #!/bin/sh
    FAKE_PHP_DIR=~/php-71-bin

    # Add a fake dir if it is not added yet
    case :$PATH: in
        *:$FAKE_PHP_DIR:*) ;; # do nothing
        *) export PATH="$FAKE_PHP_DIR:$PATH"
    esac

    exec "$@"
    ```

После этого мы можем использовать команду `php-71.sh php --version`, и убедиться, что 
вызывается именно нужная нам версия PHP.

Этот прием можно использовать и для других программ, не только PHP, но может потребоваться 
установка каких-то дополнительных переменных окружения.
