В этой статье я бы хотел затронуть очень важную тему версионности PHP. Каждому разработчику часто бывает необходимо иметь несколько версий PHP на борту для разработки. Можно обходиться классическим способом стряпать всё самому, а можно использовать подручные стредства упрощающие решение задачи. Именно поэтому, я и хочу поговорить о PhpBrew.
PhpBrew - это сборщик и установщик различных версий PHP в домашней директории. Он так же умеет быстро переключать необходимые версии PHP одной командой. Более подробно: https://github.com/phpbrew/phpbrew
Сегодня мы соберем и установим вместе PHP версии 5.4.41. Поехали!
Для начала вам нужно установить и настроить PhpBrew на своем компьютере. В этом вам поможет оф.инструкция или это
Для того, чтобы узнать, какие версии "знает" PhpBrew, нужно набрат команду phpbrew known
.
У меня, на момент написания статьи, такой результат:
$ phpbrew known
5.6: 5.6.9, 5.6.8, 5.6.7, 5.6.6, 5.6.5, 5.6.4, 5.6.3, 5.6.2 ...
5.5: 5.5.25, 5.5.24, 5.5.23, 5.5.22, 5.5.21, 5.5.20, 5.5.19, 5.5.18 ...
5.4: 5.4.41, 5.4.40, 5.4.39, 5.4.38, 5.4.37, 5.4.36, 5.4.35, 5.4.34 ...
5.3: 5.3.29, 5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22 ...
You can run `phpbrew update` to get a newer release list.
Меня интересует ветка 5.4, а именно 5.4.41.
Наберем в консоле phpbrew variants
, чтобы узнать какие варианты установки у нас имеются.
Из всего списка, я выбрал следующее:
- mysql
- pdo
- apxs2
Всё остальное я установлю позже, т.к. даже с таким набором чаще всего вылезают ошибки.
Пробуем:
phpbrew install php-5.4.41 +mysql +pdo +apxs2
Вот и первая ошибка, Exception: apxs binary is not executable: ../Cellar/httpd22/2.2.29/bin/apxs
- не найден бинарник для apxs. Ищем вручную и указываем путь.
sudo find /usr -name apxs
Указываем путь и повторяем установку, но уже с аттрибутом -d
, для того, чтобы получить больше информации во время ошибок и установки.
phpbrew -d install php-5.4.41 +mysql +pdo +apxs2=/usr/local/bin/apxs
На этот раз установка успешна, о чем нам говорит текст в консоли.
Переключаемся на установленную версию PHP:
phpbrew switch php-5.4.41
и меняем путь до модуля PHP в httpd.conf вашего Apache. Там у нас будет писок модулей, где старый модуль PHP (если был) будет закомментирован. Всё же, стоит убедиться в корректности сие и проверить самому. Поэтому проверяем, если всё впорядке и из всего списка моделй PHP у нас указан только один - всё хорошо, если нет - комментируем ненужные добавив в начао строки #
и раскомментируем нужный. Сохранем.
Перезапускаем Apache.
sudo httpd -k restart
Проверям, должна быть версия 5.4.41:
php -v
Доустанавливаем недостающие расширения.
Огласите весь список, пожалуйста! (с)
phpbrew ext
Из этого я делаю вывод, что мне необходимо установить:
- bcmath
- bz2
- calendar
- ctype
- curl
- ftp
- gd
- gettext
- hash
- intl
- json
- mbstring
- mcrypt
- openssl
- pcntl
- readline
- shmop
- simplexml
- sockets
- zip
Список хороший, не спорю. Начнем с Intl
и GD
, т.к. с ними обычно проблема. С другими проблем нет.
Для начала, давайте обновим ICU в системе до последней версии. На момент написания статьи это 55.1.
Скачиваем исходник в домашнюю папку с http://site.icu-project.org/download . Нас интересует колонка ICU4C.
Выполняем по очереди комманды:
tar xzvf icu4c-<version>-src.tgz
cd icu/source
chmod +x runConfigureICU configure install-sh
./runConfigureICU MacOSX
make
sudo make install
Имейте ввиду, что после обновления ICU все расширения использующие старую версию ICU будут по прежнему её использовать. Вам так же необходимо скомпилировать все расширения заново.
Теперь установим Intl
:
phpbrew ext install intl
Проверим результат. Для этого создадим в домашней директории тестовый файл:
touch test.php
nano test.php
В открытом редакторе пишем:
<?php
echo "PHP: " . PHP_VERSION . "\n";
echo "ICU: " . INTL_ICU_VERSION . "\n";
Сохраняем (CTRL+O). Закрываем (CTRL+X). Выполняем:
php ./test.php
Вывод должен быть таким:
PHP: 5.4.41
ICU: 55.1 // либо другая версия, которая на данных момент актуальна, но не ниже
Отлично! Переходим к GD
.
GD - это, геморрой. Большой геморрой. Просто так запустить на установку не получится, поэтому даже пробовать не будем. Первый делом, давайте посмотрим, какие аргументы принимает установщик.
phpbrew ext show gd
И так, нам нужно указать:
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
Остальное, по крайней мере меня, не интересует. В будущем если понадобится - аналогично добавите.
Ищем файлы заголовок (это файлы с расширением .h
) для jpeg
, png
, freetype
в /usr
и указываем путь до директории include
, где они лежат.
jpeg
sudo find /usr -name jpeg*.h
/usr/local/Cellar/jpeg/8d/include/jpeglib.h
png
sudo find /usr -name png*.h
/usr/local/Cellar/libpng/1.6.15/include/png.h
freetype
sudo find /usr -name freetype.h
/usr/local/Cellar/freetype/2.5.4/include/freetype2/freetype/freetype.h
Устанавливаем:
phpbrew -d ext install gd -- --with-jpeg-dir=/usr/local/Cellar/jpeg/8d --with-png-dir=/usr/local/Cellar/libpng/1.6.15 --with-freetype-dir=/usr/local/Cellar/freetype/2.5.4
Проверяем, для этого открываем наш файл test.php
и добавим следующее:
echo 'GD: ';
var_dump(gd_info());
Смотрим:
php ./test.php
Результат должен быть примерно таким:
PHP: 5.4.41
ICU: 55.1
GD: array(12) {
["GD Version"]=>
string(26) "bundled (2.1.0 compatible)"
["FreeType Support"]=>
bool(true)
["FreeType Linkage"]=>
string(13) "with freetype"
["T1Lib Support"]=>
bool(false)
["GIF Read Support"]=>
bool(true)
["GIF Create Support"]=>
bool(true)
["JPEG Support"]=>
bool(true)
["PNG Support"]=>
bool(true)
["WBMP Support"]=>
bool(true)
["XPM Support"]=>
bool(false)
["XBM Support"]=>
bool(true)
["JIS-mapped Japanese Font Support"]=>
bool(false)
}
Все остальные расширения из моего списка устанавливаются простым phpbrew ext install <ext_name>
. Дело за вами.
Так же, не забудьте установить xdebug
! =)