Текуща ситуация: PHP2Shell. Две критични уязвимости в PHP (CVSS 9,2) позволяват злонамерен код без вход. Корекции от 21.10.2026 г.Какво да направите сега →

Компилиране на PHP от изходния код

PHP може да се изгради сам с configure и make. Това дава контрол върху разширенията и опциите, но и пълна отговорност за всяка актуализация за сигурност.

Актуалност 5 мин. четенеЗнания за PHP

Накратко: Да се компилира PHP означава да се изтегли официалният пакет с изходен код от php.net, с ./configure да се определят желаните интерфейси и разширения, да се изгради с make, да се провери с make test и след това да се инсталира. Това дава пълен контрол върху версията и обема. Цената: за всяка актуализация за сигурност отговаряте Вие сами, както последно при PHP2Shell, когато трябваше да се изгради наново и всички процеси да се рестартират.

Кога собствените билдове на PHP са смислени

Повечето сървъри получават PHP от източник на пакети: от Linux дистрибуцията, от хранилище на трета страна или чрез образ на контейнер. За нормалната експлоатация това обикновено е най-добрият избор, защото корекциите за сигурност се доставят автоматично.

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

Ситуация Източник на пакети Собствен билд
Нормален уеб сървър най-често по-добре рядко необходим
Версия или опция не са в надежден източник не е налична смислен
Откриване на грешки в самия PHP, debug билд ограничено смислен
Минимален обем функции за специални системи ограничено смислен
Актуализации за сигурност идват с източника собствена задача

Който се реши за собствени билдове, се нуждае от твърд процес за актуализации, иначе предимството става риск.

Предпоставки

Според ръководството са нужни GNU make и C компилатор; от PHP 8.4 компилаторът трябва да поддържа C11. Който изгражда от git хранилището, а не от пакет на изданието, се нуждае допълнително от autoconf (от 2.68), re2c (от 1.0.3 за PHP 8.3 и по-нови) и bison (от 3.0.0). README в изходния код посочва за Ubuntu това начало:

sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev

За всяко допълнително разширение се добавят подходящите пакети за разработка, например за OpenSSL или libsodium.

Изтегляне на изходния код и проверка на автентичността

Самостоятелно изграденият PHP е толкова надежден, колкото е надежден изходният му код. php.net предлага всеки пакет със SHA-256 контролна сума и GPG подпис; ключовете на release мениджърите са на страницата за изтегляне и на страницата с GPG ключовете.

curl -O https://www.php.net/distributions/php-8.4.27.tar.xz
curl -O https://www.php.net/distributions/php-8.4.27.tar.xz.asc
sha256sum php-8.4.27.tar.xz                     # сравнете със стойността на php.net
gpg --verify php-8.4.27.tar.xz.asc php-8.4.27.tar.xz

Едва когато контролната сума и подписът съвпадат, се продължава.

Компилиране на PHP: configure, make, test

Процесът има четири стъпки:

  1. Конфигуриране: ./configure с желаните опции. При изграждане от git преди това се изпълнява ./buildconf.
  2. Изграждане: make -j"$(nproc)"; броят на задачите според README разумно съответства на броя на ядрата на процесора.
  3. Тестване: make TEST_PHP_ARGS=-j4 test изпълнява тестовия пакет на PHP.
  4. Инсталиране: make install, според целевата директория с root права.

Пример за билд на PHP-FPM със собствена целева директория:

tar xf php-8.4.27.tar.xz && cd php-8.4.27
./configure --prefix=/opt/php-8.4 \
  --with-config-file-path=/opt/php-8.4/etc \
  --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-fpm-systemd \
  --with-openssl --with-sodium \
  --disable-cgi
make -j"$(nproc)"
make TEST_PHP_ARGS=-j4 test
sudo make install
/opt/php-8.4/bin/php -v

Най-важните опции накратко:

Опция Действие
--enable-fpm изгражда PHP-FPM; към това --with-fpm-user, --with-fpm-group, --with-fpm-systemd
--with-config-file-path директория, в която PHP търси php.ini
--with-openssl поддръжка на OpenSSL; от PHP 7.4 пътят се намира чрез pkg-config
--with-sodium съвременна криптография с libsodium
--disable-cgi отказва се от CGI варианта, когато не е нужен
--enable-debug debug символи, според README препоръчани за разработка, не за продукция
--enable-zts безопасност за нишки при режими на работа с нишки

С --prefix няколко самостоятелно изградени версии могат да се инсталират една до друга, например под /opt/php-8.3 и /opt/php-8.4. Това улеснява преминаванията, но изисква дисциплина: всяка инсталирана версия е отделен софтуер, който трябва да се изгражда наново при всяко издание за сигурност, дори когато в момента никой уебсайт не я ползва. Билдовете, които вече не са нужни, трябва да се премахват напълно. Кои опции има един наличен билд, показва php -i в реда „Configure Command“; той е най-добрият шаблон за следващото изграждане.

Бележка за OPcache: от PHP 8.5, според приетия RFC, OPcache е неотменно компилиран. При по-старите версии той се изгражда като разширение и се зарежда с zend_extension. Какво са разширенията и интерфейсите, обясняват Разбиране на разширенията на PHP и SAPI, обяснен.

Собствени билдове и сигурност: задълженията след PHP2Shell

Самостоятелно компилираният PHP има реално предимство за сигурността: изграждате само онова, което Ви трябва. Всяко неизградено разширение и всеки неизграден режим на работа е код, който не може да съдържа уязвимост. Билд без CGI, с малко разширения и ясни пътища е прегледен.

Срещу това стои твърдо задължение. Дистрибуциите при PHP2Shell доставиха backport отчасти на 21.10.2026 г.; който изгражда сам, не получава нищо автоматично. Конкретно това означаваше:

  1. Да се изтегли и провери изходният код на коригираната версия.
  2. Да се изгради наново със същите опции; php -i показва първоначалния ред на configure.
  3. Да се изпълнят тестовете и да се инсталира.
  4. Да се рестартират всички PHP процеси, както е описано в Рестартиране на PHP-FPM и на всички worker процеси.
  5. Да се провери работещата версия, както е обяснено в Правилна проверка на версията на PHP и състоянието на пачовете.
Важно

Самостоятелно изграденият PHP не се появява в никой мениджър на пакети. Водете опис на кои сървъри с коя версия работят собствени билдове, иначе те ще бъдат пропуснати при следващата уязвимост.

Как помага PHP SOS конкретно?

Чрез услугата за PHP пачове подпомагаме операторите на собствени билдове:

  • Описване на наличното: Намираме самостоятелно изградените версии на PHP и четем опциите на билда им.
  • Ново изграждане: Коригирана версия с проверен подпис, същите опции и пълно тестово изпълнение.
  • Внедряване и рестартиране: Инсталиране, рестартиране на всички процеси, проверка на работещата версия.
  • Опростяване: Където поддържан източник на пакети изпълнява същата цел, показваме прехода.

Често задавани въпроси

Кога си струва PHP да се компилира сам?

Когато нужна версия или опция не е налична в никой надежден източник на пакети, за разработка и откриване на грешки в самия PHP или за много леки, специални билдове. За обикновените уеб сървъри поддържаните пакети са най-често по-добрият избор.

Как проверявам, че изходният код на PHP е автентичен?

php.net предлага за всеки пакет с изходен код SHA-256 контролна сума и GPG подпис. Сравнете контролната сума и проверете подписа с публикуваните на php.net ключове на release мениджърите.

Трябва ли да компилирам наново след издание за сигурност?

Да. Самостоятелно изграденият PHP не получава актуализации от дистрибуцията. След PHP2Shell това означаваше: да се изгради изходният код на 8.5.12, 8.4.27, 8.3.36 или 8.2.35, да се инсталира и всички PHP процеси да се рестартират.

Къде мога да намеря всички опции на configure?

С ./configure --help в директорията с изходния код. Ръководството посочва най-важните основни опции, а опциите за разширенията са на техните страници в ръководството.

Източници

Незабавен контакт

Всеки час има значение. Пишете ни сега.

Опишете накратко системата, версията на PHP и какво сте забелязали. Ние се свързваме с Вас, уточняваме ситуацията и работим отдалечено, докато инцидентът бъде приключен и документиран.

Незабавна помощ