PHP 7.X 특징 및 개선점

홈 > IT > IT정보
IT정보

PHP 7.X 특징 및 개선점

과거 PHP의 최종 버전은 5.6이며
PHP6을 Unicode 네이티브 문자열이 모든 언어와 플랫폼에 지원이 가능하도록 목표로 하여 진행 했지만
자원낭비가 심한 문제가 있어 2010년에 개발을 중단하였습니다
이후 2014년 초에 PHP 성능 개선 프로젝트인 PHPNG(Next Generation)로 브랜치를 생성하였고
개발 중 많은 개선사항이 있어 결국 2014년 8월에 PHP7 기반 프로젝트로 채택되었습니다.
6버전 없이 바로 7로 채택된 이유는 RFC에서 투표를 통해 개발 중단된 6과의 혼동을 원치 않아서라고 합니다.
 
PHP7에서 어떠한 내용이 변경되었는지 알아보도록 하겠습니다.


Facebook의 HHVM와 PHP7

본격적인 이야기에 앞서 Zend Engine과 경쟁이 되는 HHVM에 대해서 알아보겠습니다.
페이스북은 초기에 대부분 PHP로 만들어져 빠른 개발의 장점이 있었으나, 다른 언어에 비해 느리다는 단점으로 HHVM(HipHop Virtual Machine)을 만들었고 2011년에 최초로 공개하며 Zend Engine의 경쟁자가 되었습니다. 이후 2014년에는 Hack Language를 공개해 PHP를 확장하며 기존 PHP의 호환성을 유지하였고, JIT 컴파일을 통해 더욱 향상된 성능을 선보였습니다. 이로 인해 현재 여러 기업에서 상용 서비스에 이용하는 사례가 많아지고 있습니다.

이러한 현실을 의식하듯 zend사에서는 PHP7에 대해 "HHVM보다 일반적으로 빠르다." 라고 소개하며 이목을 집중시켰고, 벤치마킹 자료 또한 "PHP7 vs HHVM"의 비교를 통해 HHVM보다 나은 속도를 목표로 했음을 강조했습니다. HHVM은 PHP7에 많은 영향을 끼쳤다는것을 짐작할 수 있습니다.


PHP7 성능

Zend Engine 개발사인 Zend사에서 "PHP7에서 반드시 알아야 할 5가지"라는 제목으로 주요 변경 사항에 대해 게재하였습니다. 성능 부분에서 PHP5.6버전에 비해 25% ~ 70%의 성능 향상을 기대할 수 있습니다.


1. zval (zend value) 구조체 개선
PHP7의 성능개선에서 제일 큰 부분을 차지하고 있는 부분으로, 초기에 JIT 컴파일로 성능향상을 시도했지만 재검토 결과 구조체 변경이 더 효과적인 것으로 결론이 나와, 변수를 저장하는 zval의 구조체를 개선하여 기존 24바이트에서 16바이트로 줄여 최적화 하였습니다. 하나의 예로 정수형에 대한 구조체가 아래와 같이 변경되었습니다.


2. 컴파일 과정에 AST(Abstract Syntax Tree) 도입
PHP 컴파일 과정에 AST단계를 추가함으로써 문법해석을 유연하게 대응하여 opcode를 최적화 할 수 있도록 하였습니다.


3. 배열(HashTable / Bucket)
- 해시 테이블 사이즈가 72bytes에서 56bytes로 감소
- 버킷 사이즈가 72bytes에서 32bytes로 감소
- 모든 버킷에 대해 메모리할당은 한번만 처리
- 배열 값 요소들이 버킷에 포함
- 향상된 데이터로 CPU캐시 실패율 감소


4. New Memory Manager
- PHP5 메모리 관리자는 CPU 시간의 20 % 이상을 소비
- 메모리 할당자를 dlmalloc에서 jemalloc으로 전환
- 할당된 메모리의 오버헤드 최소화
- linked list 대신 biteset을 사용
- 훨씬 더 CPU cache에 친화됨
- Memory Manager 오버헤드 5%감소


5. Fast Parameter Parsing API
- CPU시간의 5%를 zend_parse_parameters() 에 소요
- 간단한 기능 추가로 오버헤드 90%이상 줄임


6. 비동기 프로그래밍
- 네트워크, 데이터베이스, 파일 및 타이머에 대한 접근을 비동기로 작업 지원


7. 그밖의 개선
- New HashTable iteration API
- 배열 중복 최적화
- PCRE with JIT 지원
- strtr () 수정
- strlen(), defined() inlining
- serialize() 최적화
- IND_GLOBAL instead of FETCH + ASSIGN_REF


언어 변경사항
1. 결합 비교 연산자 도입(<=>)
펄, 루비, 그루비에 있는 <=> 복합연산자가 도입됩니다.
strcmp()와 비슷한 동작을 하는 함수인데 문자 타입에 대한 비교를 하는 strcmp()와는 달리 배열이나 객체등 여러 자료형에 사용할 수 있는 차이가 있으며, usort() 함수의 콜백 함수와 같이 정렬 기능을 만들때 효율적입니다.


2. 리턴타입 선언 및 스칼라 타입 힌트 제공
5버전에 도입된  파라메타 타입 힌트에 이어 리턴 타입도 선언할 수 있습니다. (Hack language에선 이미 지원하고 있는 사항입니다.)


3. 널 병합 연산자 (??)
isset함수를 이용한 3항 연산자와 동일하며, 축약형인 "?:" 와 비슷하지만 정의되지 않은 변수에 대해서도 오류가 나지 않습니다.


4. 치명적인 오류개선
오류를 처리하지 못하고 종료되는 현상을 EngineException 예외를 추가하여 개선하였습니다.


5. 익명함수
별도 클래스 정의 없이 바로 객체생성을 할 수 있도록 익명함수를 지원합니다.


6. Uniform Variable Syntax
함수 및 메서드 중첩 호출 지원합니다.


7. closure :: call ()
외부 클래스의 함수를 인스턴스 메소드 처럼 호출 할 수 있습니다.


8. Windows 플랫폼에 64Bit 지원
기존 64bit 윈도우 환경이 LLP64 플랫폼으로 인해 정수가 32bit로 제한되었던 부분이 64bit로 지원할수 있게 되었습니다.


9. 암호학적으로 안전한 난수 생성기(CSPRNG)
CSPRNG(Cryptographically Secure Random Number Generator)는 암호의 안전성을 보장하며 예측 불가능한 난수를 생성기로 아래와 같은 함수가 추가되었습니다.

최근글


새댓글


Facebook Twitter GooglePlus KakaoStory KakaoTalk NaverBand
PlusFriend Chat