PHP 7 커 널 참조 상세 설명
지난 장 에서 인용(REFERENCE)은 PHP 5 때 하나의 표지 위 치 였 고 PHP 7 이후 에 우 리 는 그것 을 새로운 유형 으로 만 들 었 다.ISREFERNCE.그러나 인용 은 흔히 볼 수 있 는 응용 프로그램 이기 때문에 이 변 화 는 많은 변 화 를 가 져 왔 고 우리 에 게 PHP 7 개발 을 할 때 이 유형 을 처리 하 는 것 을 소홀히 해서 많은 bug 를 가 져 왔 습 니 다.
가장 간단 한 상황 은 바로 각종 유형 을 처리 할 때 이다.그 후에 우 리 는 이런 새로운 유형 을 많이 고려 해 야 한다.예 를 들 어 PHP 7 에서 이런 코드 형식 은 흔히 볼 수 있다.
try_again:
swtich (Z_TYPE_P(zv)) {
case IS_TRING:
break;
case IS_ARRAY:
break;
...
case IS_REFERENCE:
zv = Z_REFVAL_P(zv); //
goto try_again;
break;
}
여러분 이 직접 쓴 확장,이런 새로운 유형 을 고려 하 는 것 을 잊 어 버 리 면 문제 가 생 길 수 있 습 니 다.왜?
그렇다면 이런 새로운 유형 이 이렇게 많은 문 제 를 가 져 올 수 있다 면 그 때 는 왜 인용 을 하나의 유형 으로 바 꿔 야 했 을 까?왜 표지 판 을 사용 하지 않 습 니까?
한 마디 로 우리 가 이렇게 해 야 한 다 는 것 이다.- \#
앞에서 말 했 듯 이 Hashtable 은 zval 을 직접 저장 합 니 다.이렇게 기호 표 에서 두 zval 은 어떻게 하나의 수 치 를 공유 합 니까?문자열 등 복잡 한 유형 에 있어 서 는 괜 찮 습 니 다.저 희 는 zend 에 있 을 것 같 습 니 다.refcounted 구조 에 인용 으로 해결 되 었 음 을 나타 내 는 표지 위 치 를 추가 합 니 다.그러나 이것 은 Change On Write 가 가 져 온 복 제 를 만 날 수 있 습 니 다.그러나 우 리 는 PHP 7 에서 일부 유형 은 zval 에 직접 저장 되 어 있다 는 것 을 알 고 있 습 니 다.예 를 들 어 ISLONG,하지만 인용 유형 은 인용 계수 가 필요 합 니 다.그러면 하 나 는 IS 입 니 다.LONG 그리고 ISREFERNCE 의 zval 은 어떻게 표현 해 야 하나 요?
이 를 위해 우 리 는 이 새로운 유형 을 만 들 었 다.
그림 에서 보 듯 이 인용 은 새로운 유형 입 니 다:zendreference,ISREFERNCE 형식의 zval,zval.value.ref 는 zend 를 가리 키 는 것 입 니 다.reference 의 지침 은 인용 계수 와 zval 을 포함 합 니 다.구체 적 인 zval 의 값 은 zval.value.ref->val 에 존재 합 니 다.
그래서 ISLONG 의 인용 으로 말 하면 한 가지 유형 으로 IS 입 니 다.REFERNCE 의 zval,zendreference,이 zendreference->val 의 한 유형 은 IS 입 니 다.롱 의 zval.
Change On Write
PHP 는 인용 계수 로 간단 한 쓰레기 수 거 를 하고 다음 코드 를 고려 합 니 다.
<?php
1. $val = "laruence";
2. $ref = &$val;
3. $copy = $val;
?>
$ref 와$val 은 같은 zval 을 가리 키 는 인용 입 니 다.PHP 5 에서 우 리 는 하나의 인용 수 를 2 로 하고 표지 위 치 를 1 로 표시 합 니 다.$val 을$copy(line 3)에 복사 할 때$val 은 1 이상 의 인용 으로 Change on write,즉 분리 가 발생 하 는 것 을 발견 합 니 다.따라서 이 zval 을 복사 해 야 합 니 다.PHP 7 에 서 는 상황 이 많이 간단 해 졌 습 니 다.우선$ref(line 2)를 참조 할 때 IS 를 생 성 합 니 다.REFERNCE 형식,그리고 이 때 두 개의 변수 가 그것 을 인용 하기 때문에 zendreference 이 구조의 인용 계수 zval.value.ref->gc.refcount 는 2 입 니 다.
그 다음 에$copy(line 3)에 할당 되 었 을 때$val 은 인용 임 을 발 견 했 습 니 다.그래서$copy 는 zval.value.ref->val 을 가리 키 고 문자열 값 이 laruence 인 zval 을 가리 키 며 zval 의 인용 계수+1,즉 zval.value.ref->val.value.str.gc.refcount 를 2 로 복사 하지 않 았 습 니 다.
그래서 이것 은 지난 장 에서 말 한 PHP 5 의 전형 적 인 문 제 를 잘 해결 했다.예 를 들 어 우리 가 PHP 7 에서 지난 장 을 실행 한 그 문 제 를 우리 가 얻 은 결 과 는:
$ php-7.0/sapi/cli/php /tmp/1.php
Used 0.00021380008539
Used 0.00020173048281
복 제 는 확실히 일어나 지 않 았 기 때문에 어떠한 성능 문제 도 발생 하지 않 았 음 을 알 수 있다.
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 PHP 7 커 널 의 Reference 상세 한 통합 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel5.7 트레이닝 1(환경 구축~HelloWorld)후배와 함께 Laravel 기회에 할당되기 때문에 후배에게 튜토리얼과 복습을 겸하여 쓴다 대상은 PHP를 건다, Laravel은 초급자용 정도 후배씨는 PHP는 거는다. 프레임워크는 처음. 그 정도라도 알 수 있도록...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.