Накратко: Да се компилира 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
Процесът има четири стъпки:
- Конфигуриране:
./configureс желаните опции. При изграждане от git преди това се изпълнява./buildconf. - Изграждане:
make -j"$(nproc)"; броят на задачите според README разумно съответства на броя на ядрата на процесора. - Тестване:
make TEST_PHP_ARGS=-j4 testизпълнява тестовия пакет на PHP. - Инсталиране:
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 г.; който изгражда сам, не получава нищо автоматично. Конкретно това означаваше:
- Да се изтегли и провери изходният код на коригираната версия.
- Да се изгради наново със същите опции;
php -iпоказва първоначалния ред на configure. - Да се изпълнят тестовете и да се инсталира.
- Да се рестартират всички PHP процеси, както е описано в Рестартиране на PHP-FPM и на всички worker процеси.
- Да се провери работещата версия, както е обяснено в Правилна проверка на версията на 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 в директорията с изходния код. Ръководството посочва най-важните основни опции, а опциите за разширенията са на техните страници в ръководството.