PHP 5.4 установка из DotDeb

Если Вам вдруг захотелось использовать последнюю версию php-5.4.x на Debian squeeze (где по-умолчанию из пакетов устанавливается php-5.3.x),
будет проще и быстрее установить его с помощью apt-get.
Первым делом необходимо добавить новые источники пакетов в файл sources.list:

deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
deb http://packages.dotdeb.org squeeze-php54 all
deb-src http://packages.dotdeb.org squeeze-php54 all

Вы может получить такую ошибку при обновлении кеша:

W: GPG error: http://packages.dotdeb.org stable Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY E9C74FEEA2098A6E
W: GPG error: http://nginx.org squeeze Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62

в этом случае необходимо добавить ключи и повторно обновить кеш:

gpg --keyserver keys.gnupg.net --recv-key 89DF5277
gpg -a --export 89DF5277 | sudo apt-key add -
gpg --keyserver keyserver.ubuntu.com --recv-key ABF5BD827BD9BF62
gpg -a --export ABF5BD827BD9BF62 | sudo apt-key add -
sudo apt-get update

Ну а теперь просто обновите установленные пакеты и обязательно нужно проапгрейдить дистрибутив:

sudo apt-get upgrade
sudo apt-get dist-upgrade

Как скомпилировать и установить php-5.4.x на Debian OS (squeeze)

Недавно я попытался установить последнюю версию PHP 5.4.x (на момент написания статьи это было 5.4.10) на мою стабильную ОС Debian OS (v6.0-squeeze-32bit).
Как вы возможно знаете, стабильная версия Debian имеет по-умолчанию в своих репозиториях версию PHP-5.3.4. Я же захотел использовать встроенный в PHP-5.4 веб-сервер.
Тогда мне казалось, что установка PHP-5.4 будет более быстрым процессом, чем конфигурированию виртуального хоста Apache. Да, я настолько ленив! 🙂
Что ж, забегая наберед, должен сообщить, что вся процедура заняла у меня 2-2.5 часа времени пока я смог запустить свои скрипты.
По правде говоря, то был первый раз когда я компилировал PHP из исходников, зато теперь я чувствую, что получил замечательный опыт в этом деле!
Ладно, давайте пройдемся по процессу пошагово.

Во-первых, вам может понадобиться установка Linux библиотеки «libxml2-dev» (хотя я не помню зачем..)
А, вспомнил! Похоже, что вы не сможет сконфигурировать PHP установщик без этой библиотеки!

sudo apt-get install libxml2-dev

Также я уверен, что большинству веб-разработчиков прийдется работать с БД из скриптов (скажем, MySQL), а в частности с расширением PDO.
Поэтому, вам необходимо скомпилировать PHP с такими опциями:

configure --with-pdo-mysql --with-mysql

(обратитесь к http://php.net/manual/en/ref.pdo-mysql.php за детальным пояснением)

Обычно, хороший разработчик активно использует дебаггер в его каждодневной работе. Как нам всем известно, самым популярным PHP отладчиком является xdebug. Это расширение может быть установлено из pecl репозиториев.
Но, прежде чем просить pecl установить для нас xdebug, удостовертесь, что у вас установлены пакет разработки php5-dev.
С этим пакетом поставляется phpize, что является необходимым условием для установки PHP пакетов через pecl.
Если у вас еще не установлен php5-dev, вы получите следующее сообщение об ошибке:

ERROR: `phpize’ failed

и вот вам команда в помощь:

sudo apt-get install php5-dev

После этого, вы сможет установить xdebug с помощью pecl:

sudo pecl install xdebug

Идем дальше. Скажем, вам приходится работать с документами, написаными не только на английском, но и на других языках (Итальянский, Португальский, Русский, Немецкий и т.д.). И предположим также, что вам необходимо обрабатывать даты в различиных форматах, который встречаются в таких документах (кстати, об этом будет моя другая публикация).
Здесь на помощь приходит расширение php5-intl! По этой ссылке — http://php.net/manual/en/intl.installation.php — вы найдете детальную информацию.
В двух словах, чтобы включить это расширение, необходимо указать опцию:

configure --enable-intl

Если вдруг конфигуратор PHP сообщит о следующей ошибке:

«configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.»

вам понадобится установить пакет Linux для работы с интернациональными данными (icu — International Components for Unicode):

apt-get install libicu-dev

Для того, чтобы иметь возможность загружать удаленные http ресурсы из ваших php скриптов, понадобится включить php5-curl.
У меня не получилось сделать это без дополнительных телодвижений, ибо я получил сообщение об ошибке следующего содержания:

configure: error: Please reinstall the libcurl distribution

Если у вас похожая ситуация, то попробуйте установить такие Linux пакеты:

sudo apt-get install libcurl4-gnutls-dev

(спасибо to http://phpconfigure.com/2011/04/configure-error-please-reinstall-the-libcurl-distribution/)

Если вам необходимо работать с мультибайтовыми кодировками и использовать функции PHP с префиксом mb_*,
понадобится включить и эту опцию:

configure --with-mbstring

Итого, после несколько часовой борьбы мне все же удалось сконфигурировать PHP необходимым образом.
Окончательный вариант выглядел так:

sudo ./configure --with-pdo-mysql --with-mysql --with-curl --enable-intl --enable-mbstring=all

Что ж, как я и сказал, я надеялся, что установка PHP-5.4 займет у меня меньше времени, чем конфигурирование виртуального хоста Apache.
Как же я ошибался!.. 🙂
Тем не менее, я ни капельки не сожалею о своем выборе, ибо теперь я чувствую себя намного уверенне в области конфигурирования и установки PHP.
Мой профессиоальный уровень вырос и я открыл для себя новые интересные вещи.

Буду рад ответить на ваши вопросы и комментарии.

Для PHP-5.4 Debian — нет suhosin, xcache, xdebug расширений

Сегодня проапгрейдил свою Debian OS 6.0 (настроено apt-pinning).
Среди прочих апдейтов при выполнении dist-upgrade привалили и обновления для ряда установленных модулей php5.  Обновился и сам PHP, собственно до версии 5.4.0-2. Но… тут начались непонятные проблемы — ни один локальный сайт не работал! В логах были непонятные ошибки, скажем, для сайта, основанного на фреймворке  YII было сообщение:

[Sun Mar 25 13:32:51 2012] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined function (null)() in /home/web/ccc/frontend/index.php on line 4

А на той строке 4 ничего не было особенного, окромя dirname(__FILE__)!
Порыскав-поискав в интернете похожие ошибки, не нашел ничего. Запостил баг на php.net.
Но дело-то неприятное! Ничегошеньки ведь не работает…
Начал копаться дальше. Попробовал запустить скрипты php из консоли, дабы проверить — неужто dirname() убрали? 🙂 И обнаружил еще ряд замечательных уведомлений warnings:

rodush@rdushko:/var/www$ php test.php
Failed loading /usr/lib/php5/20090626+lfs/xdebug.so: /usr/lib/php5/20090626+lfs/xdebug.so: cannot open shared object file: No such file or directory
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20100525+lfs/suhosin.so’ — /usr/lib/php5/20100525+lfs/suhosin.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20100525+lfs/xhprof.so’ — /usr/lib/php5/20100525+lfs/xhprof.so: cannot open shared object file: No such file or directory in Unknown on line 0

А дальше директива dirname() отработала и подключился файл, который я подключал.
Заглянув в директорию, указанную в сообщении, я обнаружил, что таких библиотек действительно нету!
Пока решил не морочить голову: допишут — обновлюсь; решил убрать конфиги php для данных библиотек.
Они расположены в директории /etc/php5/conf.d/
просто переименовал все конфиги, на которые не пришли обновления файлы с суффиксом «old» (на будущее пригодятся :), думаю)

suhosin.ini.old xdebug.ini.old xcache.ini.old xhprof.ini.old

Попробовал вызов из консоли — не ругается php. Попробовал зайти на сайты в броузере и — о чудо! — всё работает!!
Вот такие вот причуды могут быть, если php ругается на невозможность подключить дополнительные модули-библиотеки.