일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- jobdispatcher
- Service
- jobschduler
- epmty
- Job
- livedatam
- shceduler
- PHP
- firebase
- 검사
- alarmanager
- 빈
- Background
- Library
- workmanager
- schedule
- Android
- Today
- Total
에몽이
미리보는 PHP 7 PHP7의 차이점,장점 본문
PHP7의 성능개선에서 제일 큰 부분을 차지하고 있는 부분으로, 초기에 JIT 컴파일로 성능향상을 시도했지만 재검토 결과 구조체 변경이 더 효과적인 것으로 결론이 나와, 변수를 저장하는 zval의 구조체를 개선하여 기존 24바이트에서 16바이트로 줄여 최적화 하였습니다. 하나의 예로 정수형에 대한 구조체가 아래와 같이 변경되었습니다.
PHP5에선 하나의 row당 8bytes(64bit)로 * 3row 일때 24bytes가 할당 되지만, "unused"로 인해 10(8+2)bytes가 낭비되고 있습니다. 또한 zval pointer로 인해 총 32bytes를 소비하게 됩니다.
PHP7은 8bytes * 2row = 16bytes가 할당되며, zval에 대한 포인트가 없어 16bytes에서 그치게 되어, 훨씬 효율적으로 메모리가 사용되고 있습니다.
2. 컴파일 과정에 AST(Abstract Syntax Tree) 도입
PHP 컴파일 과정에 AST단계를 추가함으로써 문법해석을 유연하게 대응하여 opcode를 최적화 할 수 있도록 하였습니다.
- 버킷 사이즈가 72bytes에서 32bytes로 감소
- 모든 버킷에 대해 메모리할당은 한번만 처리
- 배열 값 요소들이 버킷에 포함
- 향상된 데이터로 CPU캐시 실패율 감소
- 메모리 할당자를 dlmalloc에서 jemalloc으로 전환
- 할당된 메모리의 오버헤드 최소화
- linked list 대신 biteset을 사용
- 훨씬 더 CPU cache에 친화됨
- Memory Manager 오버헤드 5%감소
- 간단한 기능 추가로 오버헤드 90%이상 줄임
- 네트워크, 데이터베이스, 파일 및 타이머에 대한 접근을 비동기로 작업 지원
- New HashTable iteration API
- 배열 중복 최적화
- PCRE with JIT 지원
- strtr () 수정
- strlen(), defined() inlining
- serialize() 최적화
- IND_GLOBAL instead of FETCH + ASSIGN_REF
펄, 루비, 그루비에 있는 <=> 복합연산자가 도입됩니다.
strcmp()와 비슷한 동작을 하는 함수인데 문자 타입에 대한 비교를 하는 strcmp()와는 달리 배열이나 객체등 여러 자료형에 사용할 수 있는 차이가 있으며, usort() 함수의 콜백 함수와 같이 정렬 기능을 만들때 효율적입니다.
operator | <=> equivalent |
$a < $b | ($a <=> $b) === -1 |
$a <= $b | ($a <=> $b) === -1 || ($a <=> $b) === 0 |
$a == $b | ($a <=> $b) === 0 |
$a != $b | ($a <=> $b) !== 0 |
$a >= $b | ($a <=> $b) === 1 || ($a <=> $b) === 0 |
$a > $b | ($a <=> $b) === 1 |
1 2 3 4 5 6 | function order_func($a, $b) { //PHP5 return ($a < $b) ? -1 : (($a > $b) ? 1 : 0); } function order_func($a, $b) { //PHP7 return $a <=> $b; } |
2. 리턴타입 선언 및 스칼라 타입 힌트 제공
5버전에 도입된 파라메타 타입 힌트에 이어 리턴 타입도 선언할 수 있습니다. (Hack language에선 이미 지원하고 있는 사항입니다.)
1 2 3 | function foo(): array { return [1, 2, 3]; } |
배열과 객체에서만 사용할 수 있었던 타입힌트를 스칼라타입(int, float, string, bool) 힌트를 사용 할 수 있습니다.
1 2 3 4 | function foo (int $ i) { echo $ i; } foo (3); //3 |
문서 상단에 declare(strict_types=1); 선언 시, 타입에 대해 자동 변환으로 느슨하게 처리되던 것이 엄격한 타입체크를 할 수 있게 됩니다. 지금까지 타입에 대해 엄격하지 않은 다른 언어처럼 타입선언을 명시적으로 처리하기 위함인 것 같습니다.
1 2 3 4 5 6 7 8 9 | declare(strict_types=1); function foobar(): int { return 1.0; // strictly type-checked return } class baz { function foobar(): int { return 1.0; // strictly type-checked return } } |
3. 널 병합 연산자 (??)
isset함수를 이용한 3항 연산자와 동일하며, 축약형인 "?:" 와 비슷하지만 정의되지 않은 변수에 대해서도 오류가 나지 않습니다.
1 2 3 4 5 6 7 8 9 | $a = NULL; $b = 1; $c = 2; echo isset($a) ? $a : $b; //1 echo $a ?? $b; // 1 echo $c ?? $b; // 2 echo $a ?? $b ?? $c; // 1 echo $a ?? $x ?? $c; // 2 |
4. 치명적인 오류개선
오류를 처리하지 못하고 종료되는 현상을 EngineException 예외를 추가하여 개선하였습니다.
1 2 3 4 5 6 | //PHP5 function call_method($obj) { $obj->method(); } call_method(null); // Fatal error: Call to a member function method() on a non-object |
1 2 3 4 5 6 | //PHP7 try { call_method(null); } catch (EngineException $e) { echo "Exception: {$e->getMessage()}\n"; }// Exception: Call to a member function method() on a non-object |
5. 익명함수
별도 클래스 정의 없이 바로 객체생성을 할 수 있도록 익명함수를 지원합니다.
1 2 3 4 5 6 7 | class Foo {} $ child = new class extends Foo {}; var_dump ($ child instanceof Foo); // true $ obj = new class {public $ foo = 3; public $ bar = 4;}; var_dump ($ obj -> foo); // int (3) var_dump ($ obj -> bar); // int (4) |
6. Uniform Variable Syntax
함수 및 메서드 중첩 호출 지원합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function foo() { return function() { var_dump("test"); }; } foo()(); $foo()['bar']() [$obj1, $obj2][0]->prop getStr(){0} // :: 중첩지원 $foo['bar']::$baz $foo::$bar::$baz $foo->bar()::baz() // support nested () foo()() $foo->bar()() Foo::bar()() $foo()() // 임의 표현식에 대한 지원 (...)['foo'] (...)->foo (...)->foo() (...)::$foo (...)::foo() (...)() // 실용적인 예제 (function() { ... })() ($obj->closure)() // 문법 변경 예 // old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']() |
7. closure :: call ()
외부 클래스의 함수를 인스턴스 메소드 처럼 호출 할 수 있습니다.
1 2 3 4 5 6 7 8 9 | class Foo { private $ x = 3; } $ foo = new Foo; $ foobar = function () { var_dump ($ this -> x); }; $ foobar->call($foo); // prints int (3) |
8. Windows 플랫폼에 64Bit 지원
기존 64bit 윈도우 환경이 LLP64 플랫폼으로 인해 정수가 32bit로 제한되었던 부분이 64bit로 지원할수 있게 되었습니다.1 2 3 4 | //임의의 16바이트 문자열을 반환 random_bytes (16); //5에서 10까지의 무작위 정수 반환 random_int (5, 10); |
- http://php.net/
- https://wiki.php.net/rfc
- http://php7.zend.com/
- https://www.zend.com/en/resources/php-7
- http://www.itworld.co.kr/news/94031
- http://www.excite-webtl.jp/world/korean/web/?wb_url=http%3A%2F%2Fcodezine.jp%2Farticle%2Fdetail%2F8492&wb_lp=JAKO&wb_dis=2&wb_chr=
- https://en.wikipedia.org/?title=PHP
- http://www.phpclasses.org/blog/post/242-PHP-7-Features-and-Release-Date.html
- https://drive.google.com/file/d/0B3UKOMH_4lgBUTdjUGxIZ3l1Ukk/view?usp=sharing
- http://www.zend.com/en/resources/php7_infographic
- http://talks.php.net/fluent15#/
- http://d.hatena.ne.jp/hnw/20150525
- http://www.slideshare.net/laruence/php7-the-new-engine-for-old-good-train
'web > php' 카테고리의 다른 글
php 파일 업로드 오류 이유 (1) | 2017.01.12 |
---|---|
curl (0) | 2017.01.03 |
우측의 페이지 따라다니는 사이드 바 (0) | 2016.11.05 |