PHP 역사 25년만에 가장 뛰어나다는(최신이니 당연한 것) PHP 8이 출시되었길래 PHP 8 설치 방법을 간단히 정리해 봤습니다.
20년 11월 26일 드디어 php 8이 출시 되었습니다. 2019년 11월 28일 php 7.4가 출시된 지 거의 1년만에 php 8으로 메이저 업그레이드가 이루진 것입니다.
그리고 2004년 6월 php 5 출시 후 11년만에 php 7로 메이저 업그레이드 되었지만 php 8은 5년만에 php 8로 메이저 업그레이드가 진행되었으니 그 주기가 굉장히 빨라 졌네요.
php 8로 메이저 업그레이드가 5년으로 단축된 것은 그만큼 IT 관련 업계의 발전이 빨라졌기 때문에 php 대응이 빨라져야 했기 때문으로 풀이합니다.
1. PHP 역사, php 버전 출시 일정
php 버전 별로 출시 일정을 정리해 보니 아래와 같습니다.
- 2020년 11월 26일 php 8.0
- 2019년 11월 28일 php 7.4
- 2018년 12월 6일 PHP 7.3
- 2017년 11월 30일 php 7.2
- 2016년 12월 1일 php 7.1
- 2015년 12월 3일 php 7.0
- 2014년 8월 28일 php 5.6
- 2013년 6월 20일 php 5.5
- 2012년 3월 1일 php 5.4
- 2009년 6월 30일 php 5.3
- 2006년 11월 2일 php 5.2
- 2005년 11월 24일 php 5.1
- 2004년 6월 13일 php 5.0
PHP 8 속도는 얼마나 빨라 졌나?
PHP8 출시 전부터 PHP 8 속도에 대한 테스트 결과들이 발표되곤 했는데요. PHP 8자체로는 기존 PHP 7.4등과 엄청난 성능 개선이 있다고 볼 수는 없을 것 같습니다.
다만 PHP 8이 JIT 등과 같이 사용하면 기존의 거의 배에 가까운 성능을 낸다는 성능 테스트 결과가 있네요. 이들을 잘 활용하는 방법에 대해서는 나중에 더 확인해 봐야 할 것 같네요.
2. PHP 8 설치 방법
여기에서는 데미안/우분투에서 php 8 설치 방법을 살펴보도록 하겠습니다. 이 설치 방법은 How to install/update PHP 8.0 (Debian/Ubuntu)와 [워드프레스 최적화] PHP 7.4 설치 방법를 기반으로 업그레이드 했습니다.
2.1. 기존 설치 php 확장 프로그램 리스트 확보
만약 php 7.4 등 기존 버전에서 업그레이드 한다면 기존에 설치했던 php 확장 프로그램(extensions)이 무엇인지 확인해 놓을 필요가 있습니다.
이러한 확장 프로그램을 필요에 따라 설치했기 때문에 php 8에서도 해당 확장 프로그램을 설치해야 하기 때문입니다.
이는 아래와 같은 명령을 사용해 얻을 수 있습니다.
dpkg -l | grep php | tee packages.txt
Code language: PHP (php)
그랬더니 저는 다음과 같은 확장 프로그램이 설치되어 있다고 리스트가 뜹니다. 이는 packages.txt 파일로도 저장됩니다. 이는 사용자 루트에서 확인할 수 있습니다.
ii libapache2-mod-php7.4 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php-common 2:79+ubuntu20.04.1+deb.sury.org+4 all Common files for PHP packages
ii php-imagick 3.4.4-5+ubuntu20.04.1+deb.sury.org+1 amd64 Provides a wrapper to the ImageMagick library
ii php-pear 1:1.10.12+submodules+notgz-1+ubuntu20.04.1+deb.sury.org+1 all PEAR Base System
ii php7.4 7.4.12-3+ubuntu20.04.1+deb.sury.org+1 all server-side, HTML-embedded scripting language (metapackage)
ii php7.4-bcmath 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Bcmath module for PHP
ii php7.4-bz2 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 bzip2 module for PHP
ii php7.4-cgi 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 server-side, HTML-embedded scripting language (CGI binary)
ii php7.4-cli 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 command-line interpreter for the PHP scripting language
ii php7.4-common 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 documentation, examples and common module for PHP
ii php7.4-curl 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 CURL module for PHP
ii php7.4-dba 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 DBA module for PHP
ii php7.4-dev 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Files for PHP7.4 module development
ii php7.4-enchant 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Enchant module for PHP
ii php7.4-fpm 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php7.4-gd 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 GD module for PHP
ii php7.4-gmp 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 GMP module for PHP
ii php7.4-imap 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 IMAP module for PHP
ii php7.4-interbase 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Interbase module for PHP
ii php7.4-intl 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Internationalisation module for PHP
ii php7.4-json 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 JSON module for PHP
ii php7.4-ldap 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 LDAP module for PHP
ii php7.4-mbstring 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 MBSTRING module for PHP
ii php7.4-mysql 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 MySQL module for PHP
ii php7.4-odbc 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 ODBC module for PHP
ii php7.4-opcache 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Zend OpCache module for PHP
ii php7.4-pgsql 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 PostgreSQL module for PHP
ii php7.4-phpdbg 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 server-side, HTML-embedded scripting language (PHPDBG binary)
ii php7.4-pspell 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 pspell module for PHP
ii php7.4-readline 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 readline module for PHP
ii php7.4-snmp 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 SNMP module for PHP
ii php7.4-soap 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 SOAP module for PHP
ii php7.4-sqlite3 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 SQLite3 module for PHP
ii php7.4-sybase 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Sybase module for PHP
ii php7.4-tidy 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 tidy module for PHP
ii php7.4-xml 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 DOM, SimpleXML, XML, and XSL module for PHP
ii php7.4-xmlrpc 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 XMLRPC-EPI module for PHP
ii php7.4-xsl 7.4.12-3+ubuntu20.04.1+deb.sury.org+1 all XSL module for PHP (dummy)
ii php7.4-zip 7.4.8-1+ubuntu20.04.1+deb.sury.org+3 amd64 Zip module for PHP
ii pkg-php-tools 1.38 all various packaging tools and scripts for PHP packages
Code language: PHP (php)
2.2. PHP 8 설치를 위한 PPA 등록
php 8 출시가 되었지만 php 공식 사이트에서 다운 받아 설치하려면 사용하는 운영체제에 따라 많은 커스터마이제이션을 해야 합니다. 그런 작업을 지식이 별로 없는 사람들은 할 수 가 없죠.
그래서 php 공식 사이트에서 출시된 버전을 각 운영 체제에 맞추어 쉽고 간단하게 설치할 수 있는 버전이 만들어 지고, 보통은 이런 운영 체제에 맞는 버전을 받아 설치하게 됩니다.
php 역사가 오래되면서 데미안이나 우분투에도 이러한 php 공식 버전을 쉽게 쉽게 설치할 수 있도록 만들어 개인 저장소(PPA, Personal Package Archive)를 통해서 배포해 주는 선지자들의 노력들이 이어져 왔습니다.
이들 중 Ondřej Surý가 가장 널리 알려져 있는데요. 그의 php 개인 저장소(PPA, Personal Package Archive)에는 이번에 업그레이드 되었던 php 8과 관련된 PECL 익스텐션들을 데비안이나 우분투 시스템에서 쉽게 설치할 수 있도록 업데이트 해 놓았습니다.
우분투에서 ondrej/php
PPA 등록
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt-get update
Code language: PHP (php)
데비안에서 ondrej/php
PPA 등록
sudo apt install apt-transport-https lsb-release ca-certificates wget -y
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
Code language: PHP (php)
2.3. PHP 8 기본 설치
php 8 패키지는 “php8.0-NAME”과 형식으로 이름이 붙습니다. php 8 기본 패키지 이름은 php8.0-common인데요. 여기에는 php8.0과 같은 기본 프로그램이 포함되어 있습니다.
그리고 php 8 패키지를 한번에 여러가지 설치 시 패키지 이름을 한 칸 띄워 적으면 됩니다. 아래는 php 8 기본 패키지와 CLI 패키지를 같이 설치할 때 아래와 같은 방식으로 적용합니다.
sudo apt install php8.0-common php8.0-cli -y
Code language: PHP (php)
위 명령어는 위에서 설명한 대로 php8.0-common 명령에 따라 몇 가지 php 8 기본 설치 합니다. 그리고 CLI 패키지도 설치합니다.
설치 버젼 확인
php 8 본 패키지를 설치 후 php 8이 제대로 설치 되었는 지 확인하기 위해서 아래 명령어를 사용합니다. php -v나 php -m
php -v # Show PHP version.
php -m # Show PHP modules loaded.
Code language: PHP (php)
# php -v
PHP 8.0.0-dev (cli) (built: Oct 4 2020 14:04:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
# php -m
[PHP Modules]
Core
ctype
curl
Code language: PHP (php)
2.4. PHP 8 서버 API 설치
사용하는 웹서버에 따라 php 8과 웹서버를 통합할 추가 패키지를 설치합니다.
웹서버 NGINX 사용 시
웹서버로 NGINX를 사용 시 아래와 같이 php8.0-fpm을 설치합니다.
sudo apt install php8.0-fpm
Code language: PHP (php)
웹서버 아파치(Apache) 사용 시
웹서버로 아파치(Apache) 사용하는 경우 mpm_event를 이용하기 위해 php8.0-fpm을 설치하고, mod_php를 이용하기 위해서 libapache2-mod-php8.0를 설치해 줍니다.
sudo apt install php8.0-fpm libapache2-mod-php8.0
Code language: PHP (php)
2.4. PHP 8 extensions
이어서 php 8 추가 확장 프로그램(extensions)을 설치합니다. 예전에는 추가 설치해야 했지만 php 8에서는 json을 따로 설치할 필요가 없어졌습니다. PHP 8에서는 php8.0-json
이 기본으로 포함되어 있습니다.
sudo apt install php8.0-{bcmath,bz2,cgi,cli,curl,dba,dev,enchant,fpm,gd,gmp,imap,interbase,intl,ldap,mbstring,mysql,odbc,opcache,pgsql,phpdbg,pspell,readline,snmp,soap,sqlite3,sybase,tidy,xml,xmlrpc,zip,,xsl}
Code language: PHP (php)
워드프레스에서 이미지 편집이나 압축등의 작업을 imagick을 사용하는데 이 프로그램을 설치하드라도 php와 연동하는 모듈을 설치하지 않으면 인식하지 않습니다. 그렇기 때문에 잊기 전에 여기서 imagick관련 php 모듈을 설치합니다.
sudo apt install php-imagick
Code language: PHP (php)
2.5. php.ini 수정
우선 사용하는 시스템에 따라 적절하게 php 설정을 변경합니다. 파일 수정은 fpm 폴더의 php.ini를 수정합니다.
nano /etc/php/8.0/fpm/php.ini
Code language: PHP (php)
저는 다음과 같은 내용들을 변경했습니다.
- date.timezone을 찾아 Asia/Seoul로 변경
- cgi.fix_pathinfo=0 값으로 변경
- 쿠키값 보안을 위해서 session.cookie_httponly 와 session.cookie_secure 값을 1을 준다.
- memory_limit = 256M
기본값은 128M - post_max_size = 56M
기본값은 8M - upload_max_filesize = 1024M
기본값은 2M이지만 초시 세팅 시 phpMyAdmin으로 DB 업로드 시 필요하기 때문에 용량을 크게 잡았음
세팅이 끝나면 세팅값을 낮춘다 - max_file_uploads = 50
기본값은 20
포스팅 시 첨부하느 파일 수가 얼마나 될것인지를 고려 설정 값 세팅 - zlib.output_compression = off
. PHP 압축 전송 기능을 사용 여부인데 기본값은 Off
. 압축 전송은 아파치나 NGINX와 같은 웹서버 설정에서 정의할 수도 있고, php.ini에서 설정할 수도 있고 php 프로그램에서ob_gzhander()
함수 사용할 수 있다고 함
. 그러나 3가지를 모두 사용할 수 없고 이상 같이 사용 시 압축에 압축을 거듭해 브라우저에서 제대로 해석하지 못할 수 있기 때문에 가능하면 웹서버에서만 설정 - max_execution_time = 180
기본값은 30
워드프레스에서 종종 max_execution_time exceeded라는 에러를 내는 경우가 많으므로 기본값보다는 길게 잡음
2.6. opcache 설정
opcache를 제대로 설정하면 php 성능이 비약적으로 개선됩니다. 이를 위해서 아래와 같은 옵션을 설정합니다.
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=50000
opcache.revalidate_freq=60
opcache.enable_cli=1
Code language: PHP (php)
2.7. JIT 컴파일러 사용하기
PHP 8체서 처음 적용된 JIT 컴파일러는 처음 설치 시 기본적으로 활성화 되어 있지 않습니다.
PHP 8에서 JIT 컴파일러를 사용하기 위해서는 php.ini의 [opcache] 설정에서 다음을 추가해야 합니다.
- opcache.enable=1
JIT 컴파일러가 opcache에 해당하기 때문에 이를 활성화 해야 합니다. - opcache.jit_buffer_size=100M
JIT 컴파일러가 사용하도록 할당 된 메모리 - opcache.jit=tracing
JIT 컴파일러 모드로 tracing이 기본값이며, 강력히 권고되고 있습니다. (Enabled by default and recommended for most users.)
2.8. php handler 수정
NGINX를 사용한다면 php handler에서 서버 API를 연결하도록 되어 있는데요. 여기서 php 8로 변경 설정해야 합니다.
PHP 업데이트 버전 설치 후 php block session에서 php handler를 php8.0-fpm으로 수정합니다.
nginx 기준으로 변경해야 하는 파일은 /etc/nginx/conf.d/default.conf 인데요. 사람에 따라선 이를 다른 이름으로 사용하는 분도 있습니다. 여러 개의 사이트를 운영하는 경우 사이트명을 변경하는 경우도 있습니다. 저도 이를 happist.com.conf라는 이름으로 사용하고 있습니다.
여 파일에서 fastcgi_pass unix:/run/php/php7.4-fpm.sock; 을 fastcgi_pass unix:/run/php/php8.0-fpm.sock;으로 바꾸어줘야 합니다. 그래야 php8.0을 인식하고 php8.0으로 작동합니다.
# Add PHP handler
location ~ \.php$ {
try_files $uri =404; # comment out this line if php-fpm is hosted on a remote machine
include /etc/nginx/fastcgi.conf;
fastcgi_cache WORDPRESS;
# add_header X-Cache $upstream_cache_status;
# fastcgi_pass unix:/run/php/php7.4-fpm.sock; --> 아래로 변경
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_no_cache $skip_cache;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
}
Code language: PHP (php)
이렇게 php handler 수정이 끝나면 php8.0-fpm을 재가동합니다.
systemctl restart nginx.service php8.0-fpm.service
Code language: PHP (php)
3. 기존 버젼 php 삭제하기
php 버전 업데이트 후 어느 정도 안정적으로 운영되면 기존 버전은 삭제합니다. 업그레이드 되었으면 기본 버전은 불필요한 것은 사실이므로..
apt-get purge `dpkg -l | grep php7.4| awk '{print $2}' |tr "\n" " "`
Code language: PHP (php)
참고
PHP 25년 역사의 새장을 여는 PHP 8 설치 방법 – 우분투 및 데비안 기준
아직 워드프레스 PHP 8 적용은 시기상조, 속도 개선 없고 플러그인 문제 발생
[워드프레스 최적화] 한층 빨라진 최신 php 7.3 설치 방법
[워드프레스 최적화] 보안과 서버 속도 개선을 위한 php 7.2 설치 방법 및 주의 사항
더 빠른 워드프레스를 위한 PHP 7.1 업그레이드 방법
서버 운영 관련
우분투 20.04와 PHP 8 기반 워드프레스 설치 방법
가성비가 뛰어난 Vultr 가상서버호스팅(클라우드호스팅,VPS) 사용기
Vultr 가상서버호스팅의 새상품 High Frequency 사용기
가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로
해외 가상서버호스팅(VPS)이 국내 호스팅보다 빠르다? – 아이비호스팅과 해외 가상서버호스팅 VULTR간 비교
사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.2)