어제 PHP 7.0을 컴파일해 보았습니다. 또한, 이 블로그에 실험적으로 PHP 7.0 버전을 적용해 보았습니다.

PHP 7은 올해 초에 새로 발표된 PHP의 메이저(major) 버전으로, 많은 기능이 추가 및 변경되었고 속도도 전반적으로 향상되었습니다. PHP 7에서 대략적으로 변경된 내용을 정리해보자면

- 빨라진 속도 (2 ~ 10배 빠른 연산)
- 메모리 사용량 감소 (일반적으로 PHP 5.5의 메모리 사용량의 1/3이라고 합니다.)
- mysql extension 제거 (mysqli 및 mysqlnd로 대체가 가능합니다.)
- ereg_* 함수 제거 (preg_* PCRE 정규표현식 함수로 대체가 가능합니다.)
- 이름이 없는 클래스 지원
- 'use' 사용 그룹화 지원

등 이외에도 많은 변경사항이 있었습니다. 

이제 PHP7을 컴파일 해 보겠습니다. 사실 컴파일이라는 것은 다소 전문성이 있는 이야기이므로 이제부터는 명령어 위주의 설명이 진행됩니다. 또한 컴파일 시에는 의존적인 라이브러리(dependency) 설치가 선행되어야 합니다.
아래 설명에 사용된 운영체제는 CentOS 7 (x64) 입니다. Red Hat 계열 운영체제는 모두 가능할 것이라고 생각됩니다.

라이브러리 설치

yum install epel-release
yum install gcc libxml2-devel pkgconfig openssl-devel bzip2-devel libpng-devel libjpeg-devel libXpm-devel freetype-devel gmp-devel libmcrypt-devel mariadb-devel enchant-devel unixODBC-devel cyrus-imapd-devel libmcrypt-devel openldap-devel zlib-devel libnghttp2-devel sqlite-devel

mkdir ~/php7 && cd ~/php7


curl 컴파일 설치 (yum install libcurl-devel로 대체 가능합니다.)


wget https://curl.haxx.se/download/curl-7.49.1.tar.gz
tar xvf curl-7.49.1.tar.gz && cd curl-7.49.1
./configure --with-libdir=lib64 --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --prefix=/opt/curl-7.49.1 --with-zlib=/usr --with-nghttp2 --with-ssl=/usr --with-libssh2=/usr --enable-ipv6 --enable-http --enable-ftp --enable-file --enable-ldap --enable-ldaps --enable-proxy --enable-rtsp --enable-telnet --enable-tftp --enable-pop3 --enable-imap --enable-smb --enable-smtp --disable-manual --enable-crypto-auth --enable-unix-sockets --enable-cookies
make -j4
sudo make install

PHP 7 컴파일 설치

글을 작성하는 시점에서 가장 최신 버전은 PHP 7.0.8 입니다.

wget http://kr1.php.net/get/php-7.0.8.tar.bz2/from/this/mirror -O php-7.0.8.tar.bz2
tar xvf php-7.0.8.tar.bz2 && cd php-7.0.8
./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --prefix=/opt/php7 --exec-prefix=/opt/php7 --libdir=/opt/php7/lib64 --with-libdir=lib64 --with-bz2=shared --with-zlib=shared --enable-zip=shared --enable-soap=shared --enable-intl=shared --with-mcrypt=shared --with-openssl=shared --with-readline --with-curl=shared,/opt/curl-7.49.1 --enable-ftp=shared --enable-mysqlnd=shared --with-mysqli=shared,mysqlnd --with-mysql-sock=/var/lib/mysql/mysql.sock --with-pdo-mysql=shared,mysqlnd --with-sqlite3=shared --with-pdo-sqlite=shared --with-imap=shared --with-imap-ssl --enable-sockets=shared --enable-pcntl=shared --with-enchant=shared --with-unixODBC=shared,/usr --with-gettext=shared --enable-ctype=shared --with-gd=shared --enable-exif=shared --with-xpm-dir=shared --with-jpeg-dir=shared --with-png-dir=shared --with-freetype-dir=shared --with-iconv=shared --with-xsl=shared --enable-bcmath=shared --enable-mbstring=shared --enable-simplexml=shared --enable-json=shared --enable-tokenizer=shared --with-tidy=shared --enable-dom=shared --enable-phar=shared --enable-hash --enable-session --enable-xml=shared --enable-wddx=shared --enable-opcache=shared --enable-calendar=shared --with-pdo-odbc=shared,unixODBC,/usr --enable-fileinfo=shared --with-pcre-regex --enable-gd-native-ttf --with-ldap=shared --with-ldap-sasl --with-kerberos --with-mhash=shared --enable-shmop=shared --enable-pdo=shared --enable-dba=shared --enable-posix=shared --with-xmlrpc=shared --enable-xmlreader=shared --enable-xmlwriter=shared --with-layout=GNU --with-config-file-path=/opt/php7/etc --with-config-file-scan-dir=/opt/php7/etc/php.d --enable-fpm --enable-cli --disable-rpath --enable-cgi --disable-static --with-fpm-user=nginx --with-fpm-group=nginx
make -j4
sudo make install

php.ini 및 기본 설정

여기까지 기본적인 설치가 완료 되었습니다. 다음 과정은 php.ini 및 기타 extension 설정을 위한 부분입니다.
cp php.ini-production /opt/php7/etc/php.ini
mkdir -p /opt/php7/etc/php.d

/opt/php7/etc/php.d/extensions.ini에 아래와 같은 내용을 추가합니다.
extension=bz2.so
extension=calendar.so
extension=ctype.so
extension=curl.so
extension=dom.so
extension=enchant.so
extension=exif.so
extension=fileinfo.so
extension=ftp.so
extension=gd.so
extension=gettext.so
extension=iconv.so
extension=imap.so
extension=json.so
extension=ldap.so
extension=mbstring.so
extension=mcrypt.so
extension=mysqlnd.so
extension=mysqli.so
zend_extension=opcache.so
extension=openssl.so
extension=pdo.so
extension=pdo_mysql.so
extension=pdo_sqlite.so
extension=phar.so
extension=posix.so
extension=shmop.so
extension=simplexml.so
extension=soap.so
extension=sockets.so
extension=sqlite.so
extension=tokenizer.so
extension=xml.so
extension=wddx.so
extension=xmlreader.so
extension=xmlrpc.so
extension=xmlwriter.so
extension=xsl.so
extension=zip.so
extension=zlib.so


위 옵션과 같이 컴파일 및 설정하였을 때 사용가능한 extension은 bz2, calendar, ctype, curl, date, dom, enchant, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, imap, json, ldap, libxml, mbstring, mcrypt, mysqli, mysqlnd, openssl, pcre, PDO, pdo_mysql, pdo_sqlite, Phar, posix, readline, Reflection, session, shmop, SimpleXML, soap, sockets, SPL, sqlite, tokenizer, wddx, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zip, zlib 입니다. 이것으로 거의 모든 웹 어플리케이션이 사용 가능할 것이라고 생각합니다.

PHP-FPM을 사용하시려면 ~/php7/php-7.0.8/sapi/fpm/php-fpm.service 파일을 /etc/systemd/system에 복사하신 후 파일 내용을 경로에 맞게 수정하시면 될 것 같습니다.

PHP-FPM 및 nginx 설정

PHP-FPM으로 사이트를 운영하시려면 pool을 만들어야 합니다. pool이란 각 사이트별로 다른 사용자와 그룹에서 돌아가는 PHP-FPM의 (어느정도 독립된) 인스턴스입니다. 파일명은 /opt/php7/etc/php-fpm.d/blog.conf로 하겠습니다. 해당 파일에 아래의 내용을 추가합니다.

[blog]
listen = /var/run/php7-fpm/blog.sock
listen.mode = 0666
user = nginx (또는 실제 사용자명)
group = web (또는 실제 그룹명)
security.limit_extensions = .php
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /fpm-status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

nginx에서는 PHP-FPM에 으로 처리하고 싶은 부분에(예: .php 파일) 아래 내용을 추가합니다. 소켓파일의 경로는 위의 pool 파일에서 설정하신대로 변경하면 됩니다.

try_files $uri =404;
fastcgi_pass unix:/var/run/php7-fpm/blog.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;


이제 PHP 7.0 의 컴파일 및 설정이 모두 완료되었습니다. 정기적으로 보안 패치를 하시는 것을 잊지 않으셔야 겠습니다.
텍스트큐브 사용자의 경우 블로그가 로딩되지 않는다면 텍스트큐브 버전을 1.10.10 이상으로 업데이트 하신 후 GitHub Issue #1845 대로 소스코드를 수정하시면 되겠습니다. 긴 글 읽어주셔서 감사합니다.
공유하기 링크
 댓글
  • 프로필사진 luecel
    초반부에 mkdir~/php7&&cd~/php7 이라는 명령어를 치니 mkdir~/php7 : no such file or directory가 뜨네요.... ㅜ.ㅜ
    그래서 그냥 넘어갔는데 그래도 될랑가 모르겠네요;;

    그리고
    /opt/php7/etc/php.d/extensions.ini
    에 추가를 해주라고하셨는데, 그건
    vi /opt/php7/etc/php.d/extensions.ini 를 써서 하면 되나요?

    아 그리고...위에 나온대로 [php.ini 및 기본 설정]부분까지 완료했는데,
    생각해보니 전 php를 apache와 연동하여 사용할건데 configure할때 아파치에 대한 내용은 안넣어도 되는건가요?
    혹시 넣어야한다면 그냥 로 --with-apxs2=/usr/local/apache2/bin/apxs 이런식으로 입력만 하면 되나요 아니면 설치 다시 처음부터 해야하나요? ㅠㅠ

    초짜라서 잘 모르는게 많습니다 ㅜㅜ
     2017/01/28 02:18
  • 프로필사진 컴퓨터매니아
    1. mkdir 명령어는 다운받은 소스코드를 저장할 폴더를 만드는 것입니다. 아무 경로에 만드셔도 상관없습니다.

    2. 네. vi /opt/php7/etc/php.d/extensions.ini 를 사용하시면 됩니다.

    3. 아파치와 연동하시려면 configure시 --with-apxs2=[경로] 옵션은 필수입니다. 아파치는 다시 설치하지 않아도 됩니다.
     2017/01/30 17:27

             
1 2 3 4 5 6 7 8 9 ... 82