bz home

Сборка PHP7

Всем хорош NextCloud, но в какой-то момент перешёл на использование PHP7. А под ReadyNAS такого добра не было. То есть нашёлся в стандатных репах Debian 8 (jessie) какой-то php7.0, но NextCloud стремительно и от этого отказался, хочет больше версию. Дилема. Пришлось расчехлить GCC и собрать самостоятельно. Повторить желающие могут, но придётся это делать творчески, так как система у меня уже с множественными наслоениями.

Кратко суть процесса.

1. Собрать Apache2. Предварительно пришлось ещё собрать APR и APR-util, без них Апач не собирался, а версии из репозиториев не совпадали. И с штатным Апачем их поставки никак не выходило. Это значит был Апач 2.4.41.

2. Собрать PHP7.3. Я сперва собрал 7.4.6, но с ним старый NextCloud работать отказался, типа это ему слишком новое и неизведанное. Пришлось взять 7.3.19.

./configure --prefix=/usr/local/php7 --with-config-file-path=/etc/php7 \ 
 --with-apxs2=/root/a2/bin/apxs --with-openssl --with-gd --enable-bcmath --with-gmp \ 
 --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-pdo-mysql \ 
 --with-pgsql --with-pdo-pgsql \ 
 --with-curl --enable-mbstring --enable-inline-optimization --disable-opcache --enable-intl \ 
 --with-libzip=/usr/local --enable-zip --with-zlib \ 
 --with-jpeg-dir --with-png-dir --enable-exif --with-freetype-dir

make -j8

Апач был нужен ради apxs, без него PHP7 как модуль Апача не собирается. Ну и на место пршлось PHP руками подкладывать в /usr/lib/apache2/modules/. Кто знает, скажите мне как сделать ровнее. Попробовал было собрать пакет:

checkinstall --pkgname php7.3 --pkgversion 7.3.19 --install=no

но смысла особого не увидел.

Что-то там ещё с libzip было, но не помню.

Сборка PHP 7.4.8:

./configure --prefix=/usr/local/php7 --with-config-file-path=/etc/php7  --with-apxs2=/root/a2/bin/apxs \ 
 --with-openssl --enable-gd --enable-bcmath --with-gmp \ 
 --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-pdo-mysql \ 
 --with-pgsql --with-pdo-pgsql \ 
 --with-curl --enable-mbstring --enable-inline-optimization --disable-opcache --enable-intl --with-zip --with-zlib \ 
 --with-jpeg --enable-exif --with-freetype

make -j8

Собралось почти сразу, только несколько параметров автоконфига названия поменяли. Уже обновлённый NextCloud версии 19 заработал, для Piwigo пришлось указать, что на E_DEPRICATED ругаться не надо.

Сборка 8.0.6. Так как Nextcloud что-то совсем перестал работать в свежих версиях и никакие более свежие 7.4.* не решили проблем, пришлось попробовать php8. И — о чудо! — оно завелось!

./configure --prefix=/usr/local/php8 -with-config-file-path=/etc/php8 --with-apxs2=/root/a2/bin/apxs --enable-fpm \ 
 --enable-phpdbg --with-openssl --with-zlib --enable-bcmath --with-curl --enable-exif \ 
 --enable-gd --with-jpeg --with-freetype --enable-intl --enable-mbstring --with-gmp --enable-pcntl \ 
 --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-pdo-mysql \ 
 --with-pdo-pgsql=/usr/sbin/ --with-pgsql=/usr/sbin/ --with-zip

Заодно настроил Nextcloud через nginx и php-fpm.

Update

Стал падать Dokuwiki. Обновление не помогло, хотя там явно поминали фиксы для php7. Ошибка Segmentation Fault и падает без звука. С помощью phpdbg удалось установить, где падает, оказалось на всяких regexp. Вот тут объясняется почему так:

https://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error

В результате вылечилось так, в /etc/security/limits.conf:

admin - stack unlimited

в /etc/php7/php.ini:

pcre.backtrack_limit=1000
pcre.recursion_limit=1000
pcre.jit=0

PHP 8.0.20

./configure --prefix=/usr/local/php8 --with-config-file-path=/etc/php8 \ 
--enable-fpm --with-fpm-systemd --enable-phpdbg --enable-bcmath \ 
--with-openssl --with-zlib --with-curl --enable-exif --enable-ftp \ 
--enable-gd --with-jpeg --with-freetype \ 
--enable-intl --enable-mbstring --with-gmp --enable-pcntl \ 
--with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-pdo-mysql \ 
--with-pdo-pgsql=/usr/sbin/ --with-pgsql=/usr/sbin/ --with-zip --with-sodium
checkinstall --pkgname php-8 --pkgversion 8.0.20 --install=no --nodoc

PHP 8.1

Ну вот пришла пора и для PHP версии 8.1. Компилим:

./configure --prefix=/usr/local/php8.1 --with-config-file-path=/etc/php8.1 \ 
 --enable-fpm --with-fpm-systemd --enable-phpdbg --enable-bcmath --with-openssl \ 
 --with-zlib --with-curl --enable-exif --enable-ftp --enable-gd --with-jpeg --with-freetype \ 
 --enable-intl --enable-mbstring --with-gmp --enable-pcntl \ 
 --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-pdo-mysql --with-pdo-pgsql=/usr/sbin/ --with-pgsql=/usr/sbin/ \ 
 --with-zip --with-sodium --with-readline

Ставим аналогично предыдущему, сделав на скорую руку пакет.