Last Updated on 9월 27, 2021 by Jade(정현호)
안녕하세요
이번 포스팅은 PHP 버전간 Benchmark 내용을 우연치 않게 보던 중에 생각보다 버전간의 성능 개선 효과의 내용을 보게 되어 PHP 7.2->7.4 로 변경을 하게 되면서 PHP 7.4 버전을 Source Compile 로 설치하는 내용의 글 입니다.
Ref
PHP Benchmarks 7.4 vs 7.3 vs 7.2 vs 7.1 vs 7.0 (php-fpm)
https://kinsta.com/blog/php-benchmarks/
설치 환경 정보
- CentOS 7.8
- PHP 7.4.11
Source Compile 로 설치 하였습니다.
사전 필요 패키지 설치
설치시 필요한 패키지는 아래의 목록으로 설치 하였습니다.
[root]# yum -y install curl-devel libpng \
libpng-devel libjpeg libjpeg-devel libwebp \
libwebp-devel libXpm libXpm-devel openssl \
openssl-devel autoconf curl zlib zlib-devel \
freetype freetype-devel gd gd-devel \
libjpeg libjpeg-devel libmcrypt libmcrypt-devel \
libtool-ltdl-devel libzip libzip-devel \
oniguruma-devel cmake gcc-c++ gcc \
libxml2-devel libxml2 libcurl libcurl-devel \
bzip2-devel sqlite-devel
Problem encountered
PHP 7.4 컴파일 설치 시 발생 되는 몇가지 이슈가 있습니다.
1. php 7.4 에서 변경된 configure 옵션에 따른 수정 진행
2. 설치에 필요한 패키지나 라이브러리의 요구 버전이 yum 으로 다운받을 수 있는 버전보다 높아서 해당 패키지 또한 컴파일 해서 설치를 해야하는 상황
configure
7.2 버전의 컴파일에서 사용하던 configure 구문을 그대로 사용 하였을 때 몇가지의 unrecognized options warning 이 발생하였습니다.
configure: WARNING: unrecognized options: --with-gd, --with-gd, --with-jpeg-dir, --with-libxml-dir, --with-png-dir, --with-freetype-dir,
그래서 아래와 같이 수정/변경 하였습니다.
--enable-zip ==> --with-zip
--with-gd ==> --enable-gd
--with-jpeg-dir ==> -with-jpeg
--with-libxml-dir ==> --with-libxml
--with-png-dir ==> --with-png
--with-freetype-dir ==> --with-freetype
--with-png <==옵션 없음 제외
Package Missing 및 Package Compile 간 문제
error-1
checking for gdlib >= 2.1.0... no configure: error: Package requirements (gdlib >= 2.1.0) were not met: Requested 'gdlib >= 2.1.0' but version of gd-devel is 2.0.34
[root]]# yum list | grep gd-devel
gd-devel.x86_64 2.0.35-26.el7 @base
yum repository 에서 받을 수 있는 버전이 설치에 필요한 요구 버전보다 낮았습니다.
소스컴파일로 패키지를 설치 하였습니다.
[root]]# wget https://github.com/libgd/libgd/releases/download/gd-2.3.0/libgd-2.3.0.tar.gz [root]]# tar zxvf libgd-2.3.0.tar.gz [root]]# cd libgd-2.3.0 [root]]# ./configure --prefix=/usr/local/libgd-2.3.0 [root]]# make ; make install
error-2
checking for sqlite3 > 3.7.4... no
configure: error: Package requirements (sqlite3 > 3.7.4) were not met:
No package 'sqlite3' found
패키지를 설치 하여 해결 하였습니다.
[root]# yum -y install sqlite-devel
error-3
configure: error: Package requirements (oniguruma) were not met:
No package 'oniguruma' found
패키지 설치로 해결 하였습니다.
[root]# yum -y install oniguruma-devel
error-4
checking for libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0... no
configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
No package 'libzip' found
No package 'libzip' found
No package 'libzip' found
yum 으로 설되는 libzip libzip-devel 패키지의 버전이 요구 버전 보다 낮아서 libzip 을 compile 설치 하였습니다.
문제는 libzip 을 cmake 하기 위해서 또 필요한 cmake 버전이 충족치(낮아서) 않아서 cmake도 컴파일로 설치를 해야 했습니다.
- libzip 필요 CMake 버전 관련 에러 메세지
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.0.2 or higher is required. You are running version 2.8.12.2
[root]# yum -y install gcc-c++ [root]# wget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc1/cmake-3.19.0-rc1.tar.gz [root]# tar zxvf cmake-3.19.0-rc1.tar.gz [root]# cd cmake-3.19.0-rc1/ [root]# ./configure --prefix=/usr/local/cmake-3.19.0-rc1 [root]# make;make install
# libzip 설치
[root]# wget https://libzip.org/download/libzip-1.7.3.tar.gz
[root]# tar zxvf libzip-1.7.3.tar.gz
[root]# cd libzip-1.7.3
[root]# /usr/local/cmake-3.19.0-rc1/bin/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip-1.7.3
[root]# make;make install
설치전 PKG_CONFIG_PATH 환경변수 에 2개의 pkgconfig 내용을 반영 하였습니다.
[root]# export PKG_CONFIG_PATH=/usr/local/libgd-2.3.0/lib/pkgconfig:/usr/local/libzip-1.7.3/lib64/pkgconfig
Configure / Compile
Apache 와 같은 서버 에서 설치 할 경우
[root]# cd /root/pkg/php-7.4.11
[root]# export PKG_CONFIG_PATH=/usr/local/libgd-2.3.0/lib/pkgconfig:/usr/local/libzip-1.7.3/lib64/pkgconfig
[root]# ./configure --prefix=/usr/local/php-7.4.11 \
--with-apxs2=/usr/local/apache2.4.43/bin/apxs\
--with-config-file-path=/etc --enable-mysqlnd \
--with-pdo-mysql=/usr/local/mysql --enable-soap \
--enable-mbstring --with-zip --enable-exif \
--enable-gd --with-external-gd \
--with-webp --with-jpeg \
--with-libxml --enable-gd-jis-conv --with-zlib-dir \
--with-freetype --with-xpm \
--enable-sockets --with-openssl \
--with-zlib --with-gettext \
--enable-sigchild --with-iconv --enable-opcache \
--enable-fpm --with-fpm-user=apache \
--with-fpm-group=apache \
--with-curl --enable-exif --enable-bcmath \
--enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
Apache 와 다른 서버 에서 설치 할 경우
[root]# cd /root/pkg/php-7.4.11
export PKG_CONFIG_PATH=/usr/local/libgd-2.3.0/lib/pkgconfig:/usr/local/libzip-1.7.3/lib64/pkgconfig
[root]# ./configure --prefix=/usr/local/php-7.4.11 \
--with-config-file-path=/etc --enable-mysqlnd \
--with-pdo-mysql=/usr/local/mysql --enable-soap \
--enable-mbstring --with-zip --enable-exif \
--enable-gd --with-external-gd \
--with-webp --with-jpeg \
--with-libxml --enable-gd-jis-conv --with-zlib-dir \
--with-freetype --with-xpm \
--enable-sockets --with-openssl \
--with-zlib --with-gettext \
--enable-sigchild --with-iconv --enable-opcache \
--enable-fpm --with-fpm-user=apache \
--with-fpm-group=apache \
--with-curl --enable-exif --enable-bcmath \
--enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
Apache 와 다른 서버 에서 설치 할 경우
+ MySQL 이 YUM(RPM) 설치 된 환경
먼저 심볼릭 링크를 생성 후 진행 합니다.
[root]# mkdir -p /usr/local/mysql/bin
[root]# ln -s /usr/bin/mysql_config /usr/local/mysql/bin/mysql_config
[root]# cd /root/pkg/php-7.4.11
export PKG_CONFIG_PATH=/usr/local/libgd-2.3.0/lib/pkgconfig:/usr/local/libzip-1.7.3/lib64/pkgconfig
[root]# ./configure --prefix=/usr/local/php-7.4.11 \
--with-config-file-path=/etc --enable-mysqlnd \
--with-pdo-mysql=/usr/local/mysql --enable-soap \
--enable-mbstring --with-zip --enable-exif \
--enable-gd --with-external-gd \
--with-webp --with-jpeg \
--with-libxml --enable-gd-jis-conv --with-zlib-dir \
--with-freetype --with-xpm \
--enable-sockets --with-openssl --with-zlib --with-gettext \
--enable-sigchild --with-iconv --enable-opcache \
--enable-fpm --with-fpm-user=apache \
--with-fpm-group=apache \
--with-curl --enable-exif --enable-bcmath \
--enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
mcrypt 와 imagick 모듈 설치
# mcrypt 설치
[root]# yum -y install autoconf
[root]# cd /root/pkg
[root]# wget https://pecl.php.net/get/mcrypt-1.0.3.tgz
[root]# tar xvzf mcrypt-1.0.3.tgz
[root]# cd mcrypt-1.0.3
[root]# /usr/local/php-7.4.11/bin/phpize
[root]# ./configure --with-php-config=/usr/local/php-7.4.11/bin/php-config
[root]# make -j 3 && make install
# imagick 설치
[root]# yum -y install ImageMagick-devel
[root]# cd /root/pkg/
[root]# wget http://pecl.php.net/get/imagick-3.4.4.tgz
[root]# tar zxvf imagick-3.4.4.tgz
[root]# cd imagick-3.4.4
[root]# /usr/local/php-7.4.11/bin/phpize
[root]# ./configure --with-php-config=/usr/local/php-7.4.11/bin/php-config
[root]# make && make install
#설치된 모듈 확인
[root]# ls -al /usr/local/php-7.4.11/lib/php/extensions/no-debug-non-zts-20190902/
디렉토리 변경 및 후속 작업
신규 설치에 따른 추가 후속 작업 내용이 필요 하시거나 PHP-FPM 의 더 자세한 내용이 필요하실 경우 아래 포스팅을 참조하시면 됩니다.
기존에 PHP 7.2 에서 PHP 7.4 로 신규 설치에 따른 환경 변경 내용입니다.
기존의 사용중인 php.ini 에서 extension_dir 경로 변경
[root]# vi /etc/php.ini
수정
extension_dir=/usr/local/php-7.4.11/lib/php/extensions/no-debug-non-zts-20190902
혹은 (심볼릭 링크 사용시)
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902
# 기존 사용중이던 php-fpm.conf 파일 복사
[root]# cp /usr/local/php/etc/php-fpm.conf /usr/local/php-7.4.11/etc/
# 복사한 기존 파일에서 경로 등을 체크
[root]# cd /usr/local/php-7.4.11/etc/
[root]# vi php-fpm.conf
# 기존 사용 중인 php-fpm pool 설정 파일 복사
[root]# cp -rp /usr/local/php/etc/php-fpm.d/* /usr/local/php-7.4.11/etc/php-fpm.d/
# php-fpm 중지 및 경로 수정 , 서비스 재가동
[root]# systemctl stop php-fpm
필요시 서비스 파일내 경로 수정
[root]# vi /etc/systemd/system/php-fpm.service
ex)
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
# 심볼릭 링크 수정
[root]# cd /usr/local
[root]# ls -alrt
[root]# rm php
-> 기존 심볼릭 링크 삭제
[root]# ln -s /usr/local/php-7.4.11 /usr/local/php
# php-fpm 시작
[root]# systemctl daemon-reload
[root]# systemctl enable php-fpm
[root]# systemctl start php-fpm
연관된 글
proxy_balancer 를 이용한 PHP-FPM 다중화 구성
PHP8 출시 소식 및 PHP 8.0 Source Compile
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io