Trumpai: PHP kompiliuoti reiškia atsisiųsti oficialų šaltinio paketą iš php.net, su ./configure nustatyti pageidaujamas sąsajas ir plėtinius, su make sukompiliuoti, su make test patikrinti ir tada įdiegti. Tai suteikia visišką kontrolę versijai ir apimčiai. Kaina: už kiekvieną saugumo atnaujinimą atsakote patys, kaip neseniai su PHP2Shell, kai reikėjo sukompiliuoti iš naujo ir paleisti iš naujo visus procesus.
Kada prasmingi savi PHP build
Dauguma serverių PHP gauna iš paketų šaltinio: iš Linux distribucijos, trečiosios šalies saugyklos ar per konteinerio atvaizdą. Įprastai eksploatacijai tai dažniausiai geriausias pasirinkimas, nes saugumo ištaisymai pristatomi automatiškai.
Savi build vis dėlto turi savo vietą:
| Situacija | Paketų šaltinis | Savas build |
|---|---|---|
| Įprastas žiniatinklio serveris | dažniausiai geriau | retai reikalingas |
| Versija ar parinktis ne patikimame šaltinyje | neprieinama | prasminga |
| Klaidų paieška paties PHP, debug build | ribotai | prasminga |
| Minimali funkcijų apimtis specialioms sistemoms | ribotai | prasminga |
| Saugumo atnaujinimai | ateina su šaltiniu | savas darbas |
Kas renkasi savus build, turi turėti nusistovėjusį atnaujinimų procesą, antraip privalumas tampa rizika.
Reikalavimai
Pasak vadovo, reikalingi GNU make ir C kompiliatorius; nuo PHP 8.4 kompiliatorius turi palaikyti C11. Kas kompiliuoja iš Git saugyklos, o ne iš leidimo paketo, papildomai reikia autoconf (nuo 2.68), re2c (nuo 1.0.3 PHP 8.3 ir naujesnėms) ir bison (nuo 3.0.0). Pirminio kodo README Ubuntu nurodo tokią pradžią:
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
Kiekvienam papildomam plėtiniui reikia atitinkamų kūrimo paketų, pavyzdžiui, OpenSSL ar libsodium.
Pirminio kodo atsisiuntimas ir tikrumo patikra
Pačių sukompiliuotas PHP yra toks pat patikimas, kaip jo pirminis kodas. php.net kiekvieną paketą siūlo su SHA-256 kontroline suma ir GPG parašu; leidimų vadovų raktai yra atsisiuntimo puslapyje ir GPG raktų puslapyje.
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 # palyginti su reikšme php.net
gpg --verify php-8.4.27.tar.xz.asc php-8.4.27.tar.xz
Tik kai kontrolinė suma ir parašas sutampa, galima eiti toliau.
PHP kompiliavimas: configure, make, test
Eiga turi keturis žingsnius:
- Konfigūruoti:
./configuresu pageidaujamomis parinktimis. Kompiliuojant iš Git prieš tai vykdyti./buildconf. - Sukompiliuoti:
make -j"$(nproc)"; pasak README, darbų skaičius prasmingai atitinka procesoriaus branduolių skaičių. - Testuoti:
make TEST_PHP_ARGS=-j4 testpaleidžia PHP testų rinkinį. - Įdiegti:
make install, priklausomai nuo paskirties katalogo su root teisėmis.
PHP-FPM build pavyzdys su savo paskirties katalogu:
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
Svarbiausių parinkčių apžvalga:
| Parinktis | Poveikis |
|---|---|
--enable-fpm |
sukompiliuoja PHP-FPM; kartu --with-fpm-user, --with-fpm-group, --with-fpm-systemd |
--with-config-file-path |
katalogas, kuriame PHP ieško php.ini |
--with-openssl |
OpenSSL palaikymas; nuo PHP 7.4 kelias randamas per pkg-config |
--with-sodium |
šiuolaikinė kriptografija su libsodium |
--disable-cgi |
atsisako CGI varianto, jei jo nereikia |
--enable-debug |
debug simboliai, pasak README, rekomenduojami kūrimui, ne produkcijai |
--enable-zts |
gijų saugumas veikimo režimams su gijomis |
Su --prefix greta galima įdiegti kelias pačių sukompiliuotas versijas, pavyzdžiui, kataloguose /opt/php-8.3 ir /opt/php-8.4. Tai palengvina perėjimus, bet reikalauja drausmės: kiekviena įdiegta versija yra atskira programinė įranga, kurią per kiekvieną saugumo leidimą reikia sukompiliuoti iš naujo, net jei jos šiuo metu nenaudoja jokia svetainė. Nebereikalingi build turi būti pašalinti visiškai. Kokias parinktis turi esamas build, rodo php -i eilutėje „Configure Command“; tai geriausias šablonas kitam perkompiliavimui.
Pastaba apie OPcache: nuo PHP 8.5, pasak priimto RFC, OPcache yra tvirtai sukompiliuotas. Senesnėse versijose jis kompiliuojamas kaip plėtinys ir įkeliamas per zend_extension. Kas yra plėtiniai ir sąsajos, paaiškina PHP plėtinių supratimas ir SAPI paaiškinta.
Savi build ir saugumas: pareigos po PHP2Shell
Pačių sukompiliuotas PHP turi tikrą saugumo privalumą: kompiliuojate tik tai, ko reikia. Kiekvienas nesukompiliuotas plėtinys ir kiekvienas nesukompiliuotas veikimo režimas yra kodas, kuriame negali būti spragos. Build be CGI, su nedaug plėtinių ir aiškiais keliais yra aiškus.
Tam priešinga sunki pareiga. Distribucijos PHP2Shell backport iš dalies pateikė 2026-10-21; kas kompiliuoja pats, automatiškai negauna nieko. Konkrečiai tai reiškė:
- Atsisiųsti ir patikrinti ištaisytos versijos pirminį kodą.
- Sukompiliuoti iš naujo su tomis pačiomis parinktimis;
php -irodo pradinę configure eilutę. - Paleisti testus ir įdiegti.
- Paleisti iš naujo visus PHP procesus, kaip aprašyta PHP-FPM ir visų darbinių procesų paleidime iš naujo.
- Patikrinti veikiančią versiją, kaip paaiškinta Kaip teisingai patikrinti PHP versiją ir pataisų būseną.
Pačių sukompiliuotas PHP neatsiranda jokiame paketų tvarkyklėje. Tvarkykite inventorių, kuriuose serveriuose kokios versijos savi build veikia, antraip kitos spragos metu jie bus pražiūrėti.
Kaip PHP SOS padeda konkrečiai?
Per PHP pataisų paslaugą padedame savų build operatoriams:
- Užfiksuoti esamą būklę: randame pačių sukompiliuotas PHP versijas ir nuskaitome jų build parinktis.
- Sukompiliuoti iš naujo: ištaisyta versija su patikrintu parašu, tomis pačiomis parinktimis ir pilnu testų paleidimu.
- Išdiegti ir paleisti iš naujo: diegimas, visų procesų paleidimas iš naujo, veikiančios versijos kontrolė.
- Supaprastinti: kur prižiūrimas paketų šaltinis atlieka tą pačią paskirtį, parodome perėjimą.
Dažni klausimai
Kada verta PHP kompiliuoti pačiam?
Kai reikalinga versija ar parinktis nėra prieinama jokiame patikimame paketų šaltinyje, paties PHP kūrimui ir klaidų paieškai arba labai lieknoms, specialioms versijoms. Įprastiems žiniatinklio serveriams dažniausiai geresnis pasirinkimas yra prižiūrimi paketai.
Kaip patikrinti, ar PHP pirminis kodas tikras?
php.net kiekvienam šaltinio paketui siūlo SHA-256 kontrolinę sumą ir GPG parašą. Palyginkite kontrolinę sumą ir patikrinkite parašą su php.net paskelbtais leidimų vadovų raktais.
Ar po saugumo leidimo reikia kompiliuoti iš naujo?
Taip. Pačių sukompiliuotas PHP atnaujinimų iš distribucijos negauna. Po PHP2Shell tai reiškė: sukompiliuoti 8.5.12, 8.4.27, 8.3.36 ar 8.2.35 pirminį kodą, įdiegti ir paleisti iš naujo visus PHP procesus.
Kur rasti visas configure parinktis?
Su ./configure --help pirminio kodo kataloge. Vadovas nurodo svarbiausias branduolio parinktis, plėtinių parinktys pateiktos jų vadovo puslapiuose.