Last Updated on 1월 16, 2022 by Jade(정현호)
Contents
PHP 8.0 Released !
PHP 8.0 버전이 "26 Nov 2020" 에 정식 릴리즈 되었습니다
PHP 8 주요 향상 된 기능 및 New Features 로는 다음과 같습니다
Union Types
Named Arguments
Match Expressions
Attributes
Constructor Property Promotion
Nullsafe Operator
Weak Maps
Just In Time Compilation - JIT
And much much more...
PHP는 버전이 변경되면서 성능 향상이 계속 되고 있고 PHP 7.4 에서도 이전 버전에 비해 많은 개선과 성능 향상이 있었다고 벤치마크를 통해 확인 되었는데요
이번 PHP8.0의 벤치마크 결과도 이전 버전에 비해 많은 성능적 개선을 보여주고 있습니다
PHP 8.1 Released !
PHP 8.1 버전이 2021 년 11월 25일에 릴리즈 되었습니다
이번 8.1 에서는 ARM 아키텍처에서도 JIT 컴파일러가 지원하며 주요 개선 사항은 아래와 같습니다.
- JIT backend for ARM64 (AArch64)
- Inheritance cache (avoid relinking classes in each request)
- Fast class name resolution (avoid lowercasing and hash lookup)
- timelib and ext/date performance improvements
- SPL file-system iterators improvements
- serialize/unserialize optimizations
- Some internal functions optimization (get_declared_classes(), explode(), strtr(), strnatcmp(), dechex())
- JIT improvements and fixes

워드프레스 5.6 릴리즈
PHP 로 작성된 OpenSource CMS 인 WordPress 도 PHP 8.0 버전에 맞추어 업데이트 일정이 발표 되었습니다.
WordPress Core aims to be compatible with PHP 8.0 in the 5.6 release (currently scheduled for December 8, 2020)
워드프레스는 5.6 릴리즈 12월 8일에 될 예정이고 PHP 8.0 지원 될 예정 입니다
-> Update : 5.6 버전이 릴리즈 되었습니다.

5.6 버전으로 다운로드 및 기존 워드프레스 업데이트 가능 합니다.

PHP 8.0 설치
새롭게 릴리즈 된 PHP 8.0 버전 설치를 진행 해보도록 하겠습니다.
설치 환경
설치 환경 정보
OS : CentOS 7.8 / Ubuntu 18.04
PHP 설치 방식 : 8.0 버전 YUM/ APT / Source Compile 로 설치
Source Compile 파일 다운로드 URL
# wget https://www.php.net/distributions/php-8.0.0.tar.gz
# tar zxvf php-8.0.0.tar.gz
MySQL : MySQL 5.7 , Source and YUM(RPM)
etc : libgd-2.3.0 / libzip-1.7.3
사전 패키지 설치
설치시 필요한 패키지는 아래의 목록으로 설치 하였습니다.
* CentOS 7.8 기준 입니다.
[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
설치는 CentOS -YUM , Ubuntu-APT , 소스 컴파일 3개에 대해서 아래 설명 되어 있습니다.
CentOS - YUM
1. Repository 설치
centos 7.8 기준으로 yum repository에 등록된 php 최신 버전은 5.4.16 입니다
그 이상 버전을 사용하려면 먼저 REMI repository 설치를 해야 합니다.
[root]# yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
2. repo 파일 수정
Repository 설치 후 repo 파일을 수정 합니다.
[root]# vi /etc/yum.repos.d/remi.repo [remi] name=Remi's RPM repository for Enterprise Linux 7 - $basearch #baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/ #mirrorlist=https://rpms.remirepo.net/enterprise/7/remi/httpsmirror mirrorlist=http://cdn.remirepo.net/enterprise/7/remi/mirror enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
enable=0 -> enable=1 로 수정
3. PHP 8.0 설치
[root]# yum-config-manager --enable remi-php80 [root]# yum -y install php80 php80-php-common \ php80-php-fpm php80-php-gd \ php80-build php80-php php80-php-devel \ php80-php-mysqlnd php80-php-opcache \ php80-php-mbstring php80-php-pdo \ php80-php-pecl-imagick php80-php-soap \ php80-php-pecl-imagick-devel php80-php-pecl-mcrypt \ php80-php-pecl-zip php80-php-bcmath \ curl curl-devel php80-php-xml \ libpng libpng-devel libwebp libwebp-devel \ libXpm libXpm-devel openssl openssl-devel \ autoconf zlib zlib-devel freetype freetype-devel \ gd gd-devel libmcrypt libmcrypt-devel \ libtool-ltdl-devel libxml2-devel \ libxml2 libcurl libcurl-devel \ php80-php-pecl-crypto php80-php-pecl-mysql
[업데이트 ] 포스팅 20/11/28 시점에서 기존에 7.4 에 있었던 2개 패키지는 아직 확인 되지 않았으나 업데이트 된 21/07/18 시점에서는 2개 패키지가 확인 되어 위의 목록에 추가 하였습니다.
php80-php-pecl-crypto
php80-php-pecl-mysql
4. 설치 완료 후 확인
[root]# php80 -v
PHP 8.0.0 (cli) (built: Nov 24 2020 17:04:03) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
Ubuntu - apt 로 설치
1. 저장소 등록
최신 버전 설치를 위한 저장소 등록 및 PHP 설치
ubuntu$ sudo apt -y install software-properties-common
ubuntu$ sudo add-apt-repository ppa:ondrej/php
ubuntu$ sudo apt update
2. php8.0 설치
ubuntu$ sudo apt install php8.0 php8.0-cli php8.0-fpm \
php8.0-bcmath php8.0-bz2 php8.0-common php8.0-curl \
php8.0-dba php8.0-gd php8.0-mbstring php8.0-opcache \
php8.0-readline php8.0-soap php8.0-xml php8.0-zip \
php8.0-ctype php8.0-pdo php8.0-redis php8.0-mysql \
php8.0-imagick php8.0-intl php8.0-mysqlnd \
php8.0-gmp php8.0-dev -y
컴파일 설치 시 문제 발생
Source Compile Problem encountered
Configure 구문 변경
7.2 -> 7.4 로 변경시 Configure 구문 오류 내용
7.2 -> 7.4로 변경 하면서 컴파일에서 사용하던 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 <==옵션 없음 제외
PHP ./configure 시
설치에 필요한 패키지나 라이브러리의 요구 버전이 yum 으로 다운받을 수 있는 버전보다 높아서 해당 패키지 또한 컴파일 해서 설치를 해야하는 상황이 발생 하였습니다.
# 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 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
# Error2-1 : cmake-3.19 설치
[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
# Error2-2 : 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
Configure / Compile
[참고]
PHP Configure 전 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
1. 파일 다운로드
[root]# wget https://www.php.net/distributions/php-8.0.1.tar.gz
[root]# tar zxvf php-8.0.1.tar.gz
1-1 Apache 와 같은 서버 에서 설치 할 경우
[root]# cd /root/pkg/php-8.0.1
[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-8.0.1 \
--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-pdo_mysql --with-curl --enable-exif \
--enable-bcmath --enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
1-2 apache 와 다른 서버 에서 설치 할 경우
[root]# cd /root/pkg/php-8.0.1
[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-8.0.1 \
--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-pdo_mysql --with-curl --enable-exif \
--enable-bcmath --enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
1-3 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-8.0.1
[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-8.0.1 \
--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-pdo_mysql --with-curl --enable-exif \
--enable-bcmath --enable-mbstring=all \
--with-mysqli=/usr/local/mysql/bin/mysql_config
[root]# make; make install
mcrypt 와 imagick 모듈
1. Module mcrypt
PHP 에서 mcrypt 모듈은 이미 7.1에서 DEPRECATED 되었고 7.2에서는 제거 된 상태 입니다.
또한 PHP 8.0 대상으로 mcrypt 를 컴파일시 아래와 같이 에러가 발생됨에 따라 저는 8.0 버전 부터는 설치를 생략 하겠습니다.
/root/pkg/mcrypt-1.0.3/mcrypt.c: In function ‘zif_mcrypt_generic’:
/root/pkg/mcrypt-1.0.3/mcrypt.c:633:2: error: expected ‘;’ before ‘}’ token
2. imagick 설치
업데이트 일자 : 2021/01/11
PHP imagick EXT 는 GitHub 에서 확인 해보시면 됩니다.
2-1. 설치 진행
[root]# yum -y install ImageMagick-devel
[root]# cd /root/pkg/
[root]# git clone https://github.com/Imagick/imagick.git
[root]# cd imagick
[root]# /usr/local/php-8.0.0/bin/phpize
[root]# ./configure --with-php-config=/usr/local/php-8.0.0/bin/php-config
[root]# make && make install
2-2. 설치된 모듈 확인
[root]# ls -al /usr/local/php-8.0.1/lib/php/extensions/no-debug-non-zts-20200930/
컴파일 설치 후 후속 작업
Source Compile 로 설치 하였을 때 후속작업 입니다. YUM/APT 로 설치 하신 경우 생략 하시면 됩니다.
신규 설치에 따른 추가 후속 작업 내용이 필요 하시거나 PHP-FPM 의 더 자세한 내용이 필요하실 경우 아래 포스팅을 참조하시면 됩니다.

* 포스팅은 기존의 PHP 7.4 에서 PHP 8.0 로 신규 설치에 따른 환경 변경 내용입니다.
1. extension_dir 경로 변경
기존의 사용중인 php.ini 에서 extension_dir 경로 변경
[root]# vi /etc/php.ini
extension_dir 수정
extension_dir=/usr/local/php-8.0.1/lib/php/extensions/no-debug-non-zts-20200930
또는 심볼릭 링크 경로로 변경
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930
[참고] 신규 설치시 php.ini 관련
1) 파일 복사
php.ini 파일이 /etc 위치에 없을 경우 설치 source 파일 디렉토리에서 복사를 합니다.
[root]# cd /설치소스경로
[root]# cp php.ini-production /etc/php.ini
2) php.ini 파일 수정
아래 변경 사항은 필요 하면서 기본사항임으로 추가적인 내용은 시스템에 따라 맞춰서 사용하시면 되며 아래 6개는 주석 제거 및 내용 수정을 합니다
[root]# vi /etc/php.ini
extension_dir = "/usr/local/php-7.2.33/lib/php/extensions/no-debug-zts-20170718/"
(경로는 다 다릅니다.)
date.timezone = Asia/Seoul
expose_php = Off
post_max_size = 500M
upload_max_filesize = 200M
memory_limit = 512M
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=192
; 단위는 MB 이며 default는 7.0 부터 128MB 입니다(이전은 64MB)
; 192 는 예시임으로 꼭 같게 하지 않아도 됩니다
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.revalidate_path=1
opcache.dups_fix=1
opcache.fast_shutdown=1
opcache.enable_file_override=1
opcache.enable_cli=0
[imagick]
extension=imagick.so
2. 기존 사용 파일 복사
2.1 기존 사용중이던 php-fpm.conf 파일 복사
[root]# cp /usr/local/php/etc/php-fpm.conf /usr/local/php-8.0.0/etc/
2.2 복사한 기존 파일에서 경로 등을 체크
[root]# cd /usr/local/php-8.0.0/etc/
[root]# vi php-fpm.conf
2.3 기존 사용 중인 php-fpm pool 설정 파일 복사
[root]# cp -rp /usr/local/php/etc/php-fpm.d/* /usr/local/php-8.0.0/etc/php-fpm.d/
2.4 php-fpm 중지 및 경로 수정 , 서비스 재가동
[root]# systemctl stop php-fpm
2.5 필요시 서비스 파일내 경로 수정
[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
3. 심볼릭 링크 수정 및 php-fpm 기동
[root]# cd /usr/local
[root]# ls -alrt
[root]# rm php
-> 기존 심볼릭 링크 삭제
[root]# ln -s /usr/local/php-8.0.0 /usr/local/php
[root]# systemctl daemon-reload
[root]# systemctl enable php-fpm
[root]# systemctl start php-fpm
연관된 글
proxy_balancer 를 이용한 PHP-FPM 다중화 구성

PHP 7.4 Source Compile

PHP & MySQL 25주년


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