Содержание

Как собрать PHP в Ubuntu без Suhosin

Имеем: Ubuntu 12.04.5, php версии 5.3.10 с вкомпилированным Suhosin и старый legacy-код, который криво работает с Suhosin. Отключение suhosin невозможно, т.к. в данной версии Ubuntu он вкомпилирован и не отключается. Увеличить версию php5 на более новую так же нельзя - код перестает работать.

Решение: собрать php самостоятельно. Глупо, но делать нечего.

Шаг 1

Создаем рабочую папку и переходим в нее:

# cd /usr/src
# mkdir packages
# cd packages

Шаг 2

Ставим пакеты для сборки:

# sudo apt-get install devscripts
# sudo apt-get install gcc debhelper fakeroot

Шаг 3

Скачиваем исходники PHP5

# sudo apt-get source php5

Шаг 4

Скачиваем все зависимости:

# sudo apt-get build-dep php5

Шаг 5

Отключаем Suhosin.

Открываем файл php5-5.3.10/debian/rules и изменяем строку

PHP5_SUHOSIN=yes

на

PHP5_SUHOSIN=no

Шаг 6

Изменяем версию пакета php5 чтобы не было конфликтов при установке:

# cd php5-5.3.10
# debchange -v 5.3.10-1ubuntu3.20.1~nosuhosin

В редакторе по умолчанию откроется файл для редактирования, в нем можно написать что-нибудь вроде

  * Disable Suhosin patch

После внесения изменений файл нужно сохранить

Шаг 6 1/2

Не все так просто, иначе бы и не писалась эта инструкция!

При попытке сборки я получал ошибку

# start our own mysql server for the tests
/bin/sh debian/setup-mysql.sh 1995 /usr/src/php5-5.3.10/mysql_db
make: *** [test-results.txt] Error 1
dpkg-buildpackage: error: debian/rules build gave error exit status 2

Как написано в интернетах это потому что не хватает прав на запуск mysql и лечится правкой файла php5-5.3.10/debian/setup-mysql.sh

Заменить строку:

$mysqld > $datadir/run.log 2>&1 &

на

$mysqld --user=root > $datadir/run.log 2>&1 &

У меня это не заработало, под каким бы пользователем я не пробовал запустить и с какими ключами.

Поэтому был выбран мошеннический способ: я ОТКЛЮЧИЛ тестирование MySQL путем правки файла php5-5.3.10/debian/rules

Было:

RUN_TESTS = yes
ifeq (nocheck,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
  $(warning Disabling checks due DEB_BUILD_OPTIONS)
  RUN_TESTS = no
endif
ifeq ($(DEB_HOST_ARCH),$(findstring $(DEB_HOST_ARCH),hurd-i386))
  $(warning Disabling checks on hurd-i386)
  RUN_TESTS = no
endif

стало:

RUN_TESTS = yes
ifeq (nocheck,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
  $(warning Disabling checks due DEB_BUILD_OPTIONS)
  RUN_TESTS = no
endif
ifeq ($(DEB_HOST_ARCH),$(findstring $(DEB_HOST_ARCH),hurd-i386))
  $(warning Disabling checks on hurd-i386)
  RUN_TESTS = no
endif

RUN_TESTS = no

Шаг 7

Собираем php5 командой

# sudo dpkg-buildpackage -rfakeroot

Шаг 8

Устанавливаем новые пакеты:

# sudo dpkg -i *.deb

и проверяем что у нас получилось:

# php5 -v
PHP 5.3.10-1ubuntu3.20.1~nosuhosin (cli) (built: Oct 28 2015 15:48:35)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies