-
php-5.6 na CentOS-ie 5.x
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-pearPowodzenia 🙂 W razie co, proszę pisać w komentarzach.