• php-5.6 na CentOS-ie 5.x

    dodany przez Konrad Stępień

    Po co to komu?
    Ano, czasem trzeba. Wyobraźmy sobie serwer na którym chodzi jakiś dawno temu „popełniony” serwis WWW, autor od dawna niedostępny, a napisany tak, że brak chętnych do poprawiania. No to sobie chodzi na starym (choć nadal wspieranym) CentOS-ie z php-5.1, ale nagle trzeba doinstalować jakiegoś nowego WordPressa czy cokolwiek innego współczesnego i robi się problem.

    Na szczęście, możemy bez problemu mieć 2 różne php-y na raz (jednego jako moduł apache a drugiego jako php-fpm). No to do dzieła. Na początku, żeby nie robić bałaganu, tworzymy katalog „/opt/php-5.6”. Potem warto dać mu uprawnienia jakiegoś naszego użytkownika, tak żeby całej reszty nie robić jako root. Jak już to zrobimy, to logujemy się na nasze konto i przystępujemy do kompilacji. Je zdecydowałem się na wybudowanie monolitycznego php, czyli takiego co ma wszystkie potrzebne biblioteki w sobie, a nie jako osobne pliki .so. Może to nieeleganckie, ale proste i skuteczne. Sama kompilacja przebiega dość standardowo, configure, make, make install. Najważniejsze opcje dla „configure” to:
    --prefix=/opt/php-5.6
    --enable-fpm
    --with-config-file-path=/opt/php-5.6/etc/
    --with-config-file-scan-dir=/opt/php-5.6/etc/php.d/

    reszta – co kto potrzebuje. Na końcu załączyłem mojego „configure”.

    Po wszystkim trzeba jeszcze stworzyć katalog „/opt/php-5.6/etc/” i „/opt/php-5.6/etc/php.d”/ w „/opt/php-5.6/etc/” tworzymi pliki php.ini (można skopiować stary z „/etc”) i php-fpm.conf. Przykładówka php-fpm.conf jest w źródłach, w katalogu „sapi/fpm”. W tym samym katalogu jest plik init.d.php-fpm który (jak sama nazwa wskazuje) kopiujemy do „/etc/init.d” pod nazwą php-fpm. Potem zostaje tylko wystartować php-fpm i dodać co trzeba w konfigach Apache.

    ============ Diabeł tkwi w szczegółach ================
    PHP z wersji na wersję trochę się zmienia. Jak idziemy o 5 numerów w górę, to można się spodziewać dość znaczących zmian. Poniżej opiszę problemy na jakie się natknąłem i jak sobie z nimi poradziłem.

    1. klient mysql
    Jeśli w configure damy po prostu –with-mysql to php skompiluje się ze swoim własnym klientem mysql. U mnie spowodowało to komunikat o niemożliwości zalogowania, bo mam „old_password” w mysql.
    Sprawę załatwia skompilowanie php z systemową biblioteką mysql, czyli
    --with-mysql=/usr/
    Ale to nie wszystko. To samo trzeba zrobić dla mysqli i dla pdo-mysql.
    Co ciekawe, składnia dla mysqli jest trochę inna
    --with-mysqli=/usr/bin/mysql_config
    za to dla pdo-mysql taka sama jak dla mysql
    --with-pdo-mysql=/usr
    Warto też dodać opcję
    --with-mysql-sock=/var/lib/mysql/mysql.sock
    bo bez tego, mój pdo-mysql szukał socketa w /tmp i nawet zmianami w php.ini nie byłem mu w stanie tego wyperswadować.

    2. Funkcje przestarzałe
    Od którejś tam wersji php uznał, że rozszerzenie „mysql” jest przestarzałe i trzeba przejść na mysqli albo pdo-mysql. Na szczęście wszystko działa bez problemu, ale wypisuje ostrzeżenie (do logów albo co gorsza na ekran). Na szczęście, łatwo go spacyfikować przez zmienną error_reporting w php.ini. U mnie wygląda to tak:

    error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

    3. default_charset
    php może dołożyć nagłówek HTTP w którym określa jakie jest kodowanie serwowanej strony. Problem w tym, że ten nagłówek ma priorytet nad tym co deklaruje strona w meta. W php do wersji 5.5 ten nagłówek był domyślnie pusty i nie było problemu. W php-5.6 domyślnie jest to UTF-8 i mogą być problemy. Najprościej wrócić do stanu sprzed 5.6, czyli dopisać w php.ini linię:

    default_charset = ""

    ========================= mój configure ======================
    ./configure --prefix=/opt/php-5.6 \
    --enable-fpm \
    --enable-opcache \
    --with-mcrypt \
    --with-openssl \
    --with-mysql=/usr/ \
    --with-mysqli=/usr/bin/mysql_config \
    --with-pdo-mysql=/usr \
    --with-mysql-sock=/var/lib/mysql/mysql.sock \
    --with-zlib \
    --with-curl \
    --with-gd \
    --with-freetype-dir=/usr/include/freetype2/freetype/ \
    --with-t1lib \
    --enable-bcmath \
    --enable-soap \
    --with-jpeg-dir=/usr \
    --with-sqlite3 \
    --disable-rpath \
    --disable-debug \
    --with-config-file-path=/opt/php-5.6/etc/ \
    --with-config-file-scan-dir=/opt/php-5.6/etc/php.d/ \
    --enable-mbstring \
    --enable-zip \
    --without-pear

    Powodzenia 🙂 W razie co, proszę pisać w komentarzach.

Dodaj komentarz

Warto odwiedzić
Valid XHTML 1.0 Transitional centos.com.pl- mapa strony