Статьи

Как установить расширения PHP из исходного кода

Иногда трудно понять, какие расширения PHP вам понадобятся, прежде чем устанавливать PHP. В случаях, когда вам необходимо добавить расширения позже, вам может повезти, и расширение может находиться в репозитории используемой вами ОС. Это может быть просто sudo apt-get install php5-intl . В других случаях, однако, вам может понадобиться установить его из исходных кодов — Phalcon является одним из таких случаев, но он делает процедуру чрезвычайно простой , предлагая поддержку производителя, ярлыки и предварительно написанные инструкции для вашей ОС. Что, если такого нет для других расширений?

В этом руководстве мы рассмотрим установку некоторых пользовательских расширений в системах Linux (и OS X — процесс практически идентичен). Процедура очень похожа на ту, что мы уже делали на Nitrous.io , но адаптирована к локальной среде — точнее, Laravel Homestead . Вы можете легко получить инструкции по установке из этого руководства и применить их к другим дистрибутивам.

Загрузка ВМ

Если вы еще этого не сделали, прочитайте пост Homestead, связанный выше, и запустите его. Сразу после запуска новой коробки Homestead вы сможете сделать это:

Это прекрасно, потому что папка, которая монтируется по умолчанию, на самом деле еще не содержит файлов. Теперь vagrant ssh в виртуальную vagrant ssh и выполните следующие команды:

 cd Code git clone https : //github.com/Swader/publicinfo 

Это создает действительный файл PHP Info в пути, который Homestead установлен по умолчанию. Обновление URL теперь создаст экран PHPInfo:

Подготовка среды

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

Ubuntu

 sudo apt - get  install php5 - dev php5 - mysql gcc libpcre3 - dev 

мягкая фетровая шляпа

 sudo yum install php - devel php - mysqlnd gcc libtool 

RHEL

 sudo yum install php - devel php - mysql gcc libtool 

Suse

 yast2 - i php5 - pear php5 - devel php5 - mysql gcc 

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

Установка расширений

Существует два типа расширений, которые вы можете установить: связанные с PHP, но не установленные по умолчанию, и сторонние расширения. Сторонние расширения, такие как Phalcon, обычно упрощают процесс установки, предоставляя ярлыки, так как они не должны соответствовать определенным традициям, с которыми связаны PHP-расширения.

Сначала перейдем в домашнюю папку на vm: cd ~ . Там создайте папку для downloads и cd в нее. При установке связанного расширения вам понадобится исходный код PHP на вашем компьютере, желательно тот, который соответствует вашей текущей версии. Версия, которую использует Homestead, — 5.5.12, поэтому я буду загружать ее:

 wget http : //be2.php.net/distributions/php-5.5.12.tar.bz2 tar xvjf php - 5.5 . 12.tar . bz2 cd php - 5.5 . 12 

Я использую бельгийское зеркало выше, не стесняйтесь использовать это или любое другое из архивов загрузки .

Чтобы увидеть источники всех связанных расширений, перейдите в папку ext внутри папки с исходным кодом PHP без архива и составьте список с помощью ls .

Установка в комплекте расширения

Сначала мы установим расширение PHP-intl, если оно еще не установлено. Если вы это сделаете, это нормально — процедура установки, которую вы увидите ниже, идентична для каждого связанного расширения PHP. Расширение intl предназначено для интернационализации — читайте больше здесь, если вам интересно.

Поскольку расширению intl необходимо наличие библиотеки ICU (как указано в требованиях ), давайте сначала установим ее.

 sudo apt - get  install icu - devtools icu - doc libicu - dev libicu52 libicu52 - dbg 

В других дистрибутивах инструкции по установке могут отличаться. Для этого шага лучше всего обратиться к сайту ICU или к документации вашего индивидуального дистрибутива.

Как только ICU установлен, сделайте следующее, оставаясь в папке ext :

 cd intl phpize ./ configure -- enable - intl make sudo make install 

Давайте объясним, что происходит.

  • phpize подготавливает папку расширения к компиляции. Это позволяет вам выполнять последующие команды, создавая файл configure , и в основном заставляя папку расширения «думать», что это сам PHP. Процедура после phpize фактически идентична той, что вы делали бы при установке PHP из исходного кода — только в этом случае только фрагмент PHP скомпилирован и подготовлен для использования с уже скомпилированным и установленным PHP.
  • ./configure --enable-intl настраивает среду для компиляции. Он готовит все, что потребуется компилятору для intl.so файла intl.so который мы будем использовать. Флаг enable-intl необходим, даже если мы находимся в папке intl потому что папка, по сути, думает, что это PHP, и мы должны помочь ей пережить эту иллюзию. Эта команда говорит: «Хорошо, вы исходный код PHP. Теперь скомпилируйте и установите с расширением intl. », Хотя на самом деле это единственная часть, которую можно установить из этой папки.
  • make скомпилирует исходные intl.so в intl.so , поместив файл в ту самую папку, в которой вы находитесь, во intl.so папке modules .
  • sudo make install переместит этот файл в папку расширений текущей установки PHP.

Все, что нам нужно сделать сейчас, это включить расширение, используя php.ini . Мы сделаем это позже, давайте сначала скомпилируем стороннее расширение.

Установка стороннего расширения

Мы будем устанавливать Mongo как стороннее расширение. Для Mongo доступны бинарные дистрибутивы, которые упрощают установку, но давайте сделаем это вручную ради образования. Мы предполагаем, что у вас уже есть установленный Mongo, и поэтому мы сосредоточены только на расширении PHP. Если у вас не установлен Mongo, обратитесь к документации по установке .

 git clone https : //github.com/mongodb/mongo-php-driver cd mongo - php - driver phpize ./ configure make sudo make install 

Это создало наш файл mongo.so и поместило его в папку расширений нашей установки PHP. Мы включим его в следующем разделе.

Включение и тестирование

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

Как видите, они выделены ярко-зеленым цветом.

Чтобы включить их, нам нужно рассказать о них php.ini . Есть несколько способов сделать это:

  1. Вы можете поместить строки extension=mongo.so и extension=intl.so непосредственно в php.ini . Это работает, и в большинстве случаев это совершенно правильный подход.
  2. Вы можете создать отдельный ini файл для каждого из них, поместить их в папку, которая автоматически включается после загрузки php.ini , и таким образом поддерживать разделение и изоляцию php.ini . Такой подход полезнее, но труднее его реализовать.
  3. Вы можете комбинировать 2) и инструменты по умолчанию для включения модов PHP. Усадьба использует этот подход, и мы тоже.
 cd `/etc/php5/mods-available` 

Эта папка является хранилищем всех таких отдельных ini файлов. Создайте два новых файла здесь:

 sudo touch mongo . ini echo "extension=mongo.so"   |  sudo tee - a mongo . ini sudo touch intl . ini echo "extension=intl.so"   |  sudo tee - a intl . ini 

Эти команды создали два новых ini файла, каждый для одного из расширений, которые мы создали ранее. Поскольку они сейчас находятся в папке mods-available , мы можем использовать уже доступный инструмент командной строки php5enmod (сокращение от PHP enable mod).

 sudo php5enmod mongo sudo php5enmod intl 

Примечание. Если у вас нет инструмента php5enmod , сделайте символическую ссылку на ini файлы в папке conf.d различных сред выполнения php :

 ln - s / etc / php5 / mods - available / mongo . ini / etc / php5 / cli / conf . d / mongo . ini ln - s / etc / php5 / mods - available / intl . ini / etc / php5 / cli / conf . d / intl . ini ln - s / etc / php5 / mods - available / mongo . ini / etc / php5 / fpm / conf . d / mongo . ini ln - s / etc / php5 / mods - available / intl . ini / etc / php5 / fpm / conf . d / intl . ini 

Причина, по которой есть четыре записи, заключается в том, что у нас есть версия PHP для командной строки и версия PHP для FPM. Каждый использует свой собственный файл php.ini , и каждый загружает свою собственную папку conf.d для расширений — следовательно, нам нужно добавить оба расширения в обе версии PHP, если мы хотим, чтобы расширения были доступны повсюду. Используйте этот подход, только если у вас нет инструмента php5enmod .

Наконец, давайте перезапустим nginx и php-fpm для загрузки этих изменений.

 sudo service nginx restart sudo service php5 - fpm restart 

Чтобы увидеть, установили ли мы их, обновите экран PHPinfo ранее и найдите mongo и intl соответственно.

Успех!

Удаление расширений

Чтобы удалить расширения, нет необходимости удалять какие-либо реальные файлы, если у вас мало места. Вы можете сделать это тремя способами:

  1. Запустите php5dismod если у вас есть инструмент. Это противоположность инструменту php5enmod , упомянутому выше. Файлы .so останутся на месте, а файлы ini останутся mods-available , они просто не будут загружаться, потому что их символические ссылки будут удалены из папок conf.d и conf.d
  2. Удалите символические ссылки вручную. Например, sudo rm /etc/php5/cli/conf.d/mongo.ini
  3. Если вы включили расширения, поместив их непосредственно в файлы php.ini , удалите эти строки из файлов php.ini или, что еще лучше, прокомментируйте их, чтобы они оставались доступными для дальнейшего использования, если вы когда-нибудь передумали.

Вывод

Как видите, установка расширений из исходного кода чрезвычайно проста, даже если нет точных инструкций и даже если расширение не поддерживается официальным репозиторием ОС. В следующий раз, когда вам нужно будет добавить расширение в вашу установку PHP в системе * nix (это руководство также применимо и к OS X), обратитесь к этому посту за обновлением.

Пожалуйста, оставьте свой отзыв ниже, и дайте мне знать, если вас смущает определенное расширение и вы хотите помочь с его установкой.