Блог Андрея

 
 

Подробный мануал по сборке нескольких php расширений для xampp-7.3.12.0 в linux (x)ubuntu

Вы узнаете, как собрать php расширения xdebug.so, memcached.so и imagick.so для xampp установленного в linux ubuntu.

Для ленивых ссылка на уже собранные расширения PHP-7.3.12.0 в составе последней версии моей утилиты FastXAMPP.

Итак, у вас есть компьютер с ubuntu и установленным на ней xampp-linux и вам надо собрать например xdebug.so или imagick.so потому что нагуглить готовый вам почему-то не удаётся (совсем не необычная ситуация, если вы используете не ту версию php которая идёт в текущей версии ubuntu «из коробки»).

Начнём со сборки xdebug.so.

Качаем исходники xdebug с https://pecl.php.net/get/xdebug.

Переключаемся в консоли (консоль - это приложение, включающее в своё название слово «терминал» или «Konsole», например в xubuntu, которую я предпочитаю всем остальным ubuntu это xfce4-terminal (я решил писать как можно более подробно)) на пользователя root, потому что большая часть каталога /opt/lampp вам по умолчанию не доступна.

sudo su

Если у вас его до сих пор нет, ставим компилятор C/C++

apt-get install g++

То же самое для git - если у вас до сих пор его нет

apt-get install git

Я буду упоминать также использование менеджера пакетов synaptic, поэтому можно установить и его:

apt-get install synaptic. Запускается из меню программ, обычно он попадает в раздел Система и носит гордое имя «Менеджер пакетов Synaptic».

Для распаковки скачанных исходников я создал папку /opt/lampp/bin/0xd, в ней будет происходить компиляция бинарников.

Итак, я поместил скачанные файлы в мой каталог, распаковал архив и переместился в каталог, содержащий файл configure.

cd /opt/lampp/bin/0xd/xdebug-2.8.1/xdebug-2.8.1

Выполняю phpize.

Тут уже можно и нужно обратить внимание на то, что раз вы собираете расширения для версии php установленной вместе с xampp, вы и инструменты должны использовать те, которые установились вместе с xampp. Поэтому я выполняю не команду phpize, а команду /opt/lampp/bin/phpize.

/opt/lampp/bin/phpize
grep: /opt/lampp/include/php/main/php.h: Нет такого файла или каталога
grep: /opt/lampp/include/php/Zend/zend_modules.h: Нет такого файла или каталога
grep: /opt/lampp/include/php/Zend/zend_extensions.h: Нет такого файла или каталога
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:  

Неудачно, поэтому качаю исходники php c гитхаба

git clone https://github.com/php/php-src.git

После клонирования выполняем переключение на ветку с актуальной (интересующей нас) версией php. То есть, если у вас установлен xampp с версией php 7.3.12, переключаемся на ветку PHP-7.3.12 (уточнить имя ветки для вашей версии php можно в выпадающем списке «Branch» на https://github.com/php/php-src).

git checkout PHP-7.3.12

Потом можно скопировать содержимое папки в /opt/lampp/include/php (так, чтобы папка /opt/lampp/include/php/Zend существовала).

Далее попробуем опять выполнить

/opt/lampp/bin/phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

Ошибок нет, значит выполняем

./configure --with-php-config=/opt/lampp/bin/php-config

Удачно. Выполняем make.

make
#...
Нет такого файла или каталога
# include <zend_config.h>
#...

Тут я упёрся в отсутствие некоторых заголовочных файлов. Не факт что у вас не будет именно их, поэтому здесь вам надо понять принцип.

Так как вы скорее всего не знаете, из какого пакета нужный файл, гуглим строку «zend_config.h not found». Почитав ответы на найденные вопросы, можно понять, что файл должен быть в пакете php[ВЕРСИЯ_PHP]-dev.

Выполнив поиск в sуnaptic я увидел, что у меня существует доступный пакет php7.2-dev, но я собираю расширение для php-7.3.12, поэтому логично поискать на https://packages.ubuntu.com. Выполнив там поиск по строке php7.3-dev нашёл пакет https://packages.ubuntu.com/eoan/php7.3-dev.

Распковал его с помощью архтиватора в /tmp и начал с того, что скопировал

/tmp/php7.3-dev_7.3.11-0ubuntu0.19.10.1_amd64/usr/include/php/20180731/Zend

в

/opt/lampp/include/php/

То же с папкой main из скачанного пакета.

То же с папкой TSRM из скачанного пакета.

На всякий случай уточню, что этот пакет я не устанавливал, так как он от более новой версии ubuntu чем та, которая у меня установлена.

Все файлы с совпадающими именами в папках Zend, TSRM и main при копировании я НЕ заменял. И при описываемой и при последующих операциях.

Снова выполняем make.

make
#...
Build complete

Файл скомпилировался в /opt/lampp/bin/0xd/xdebug-2.8.1/xdebug-2.8.1/modules/xdebug.so

(в выводе консоли можно увидеть точный путь для вашего компьютера).

Скопировал в /opt/lampp/lib/php/extensions/no-debug-non-zts-20180731/ - выполнил /opt/lampp/lampp restart - добавил строку zend_extension=xdebug.so в php.ini - готово, ошибки PHP выводятся теперь в оранжевой таблице!

Сборка memcached

Тут уже всё пойдёт по накатанной. Это значит, что этот раздел лучше не читать не прочитав предыдущий.

Качаю с https://pecl.php.net/package/memcached последнюю версию, распаковываю её в /opt/lampp/bin/0xd. Путь к файлу configure получился таким:

/opt/lampp/bin/0xd/memcached-3.1.5/memcached-3.1.5

Выполняю

cd /opt/lampp/bin/0xd/memcached-3.1.5/memcached-3.1.5

/opt/lampp/bin/phpize

./configure --with-php-config=/opt/lampp/bin/php-config

в ответ получаю предложение использовать опцию --with-libmemcached-dir=<DIR> для указания пути к заголовочным файлам. Так как версия memcached совпала с найденной через synaptic версией пакета libmemcached-dev, я установил её через synaptic, а опцией --with-libmemcached-dir=<DIR> не воспользовался, то есть просто повторил предыдущую команду.

./configure --with-php-config=/opt/lampp/bin/php-config

Успешно. Выполнил make

make
#...
Build complete

Сборка imagick

Этот раздел также лучше не читать, не прочитав первый.

Качаю исходники из https://github.com/Imagick/imagick

распаковываю её в /opt/lampp/bin/0xd. Путь к файлу configure-cflags.sh получился таким:

/opt/lampp/bin/0xd/imagick-master

Выполняю

cd /opt/lampp/bin/0xd/imagick-master

/opt/lampp/bin/phpize

./configure --with-php-config=/opt/lampp/bin/php-config

Вижу строку

not found. Please provide a path to MagickWand-config or Wand-config program.

Решаю путём выполнения:

apt-get install libmagickwand-dev

Снова выполняю ./configure

make
#...
fatal error: pcre2.h: Нет такого файла или каталога
 #include "pcre2.h"

Решилось установкой через synaptic пакета libpcre2-dev.

Снова make и в итоге собралось без проблем.

make
#...
Build complete