PHP7 커널 참조에 대한 심층적인 이해
이전에는 참조(REFERENCE)가 PHP5의 플래그라고 말했지만, PHP7 이후에는 이를 새로운 유형인 IS_REFERNCE로 바꿨습니다. 그러나 참조는 매우 일반적인 응용 프로그램이므로 이번 변경으로 인해 많은 변경이 이루어졌습니다. 그리고 PHP7을 개발할 때 가끔 이 유형을 처리하는 것을 소홀히 해서 버그가 많이 발생했습니다.
# 🎜🎜#
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이지만 PHP7에서는 IS_LONG과 같은 일부 유형이 zval에 직접 저장되지만 참조 유형에는 참조 계산이 필요하므로 IS_LONG 및 IS_REFERNCE인 zval을 어떻게 표현합니까? 이를 위해 다음과 같은 새로운 유형을 만들었습니다.
그림에 표시된 것처럼 참조는 IS_REFERNCE에 대한 새로운 유형인 zend_reference, zval, zval입니다. value.ref는 참조 카운트와 zval을 포함하는 zend_reference에 대한 포인터입니다. 참고용으로 zval.value.ref->val에 저장됩니다. , zend_reference를 가리키는 IS_REFERNCE 유형의 zval을 사용하고 이 zend_reference->val은 IS_LONG 유형의 zval입니다.Change On Write# 🎜🎜##🎜🎜 #PHP는 참조 계산을 사용하여 간단한 가비지 수집을 수행합니다. 다음 코드를 고려하세요.
<?php 1. $val = "laruence"; 2. $ref = &$val; 3. $copy = $val; ?>
$ref와 $val은 동일한 zval에 대한 참조입니다. PHP5에서는 이 상황을 다음과 같이 표현했습니다. 참조 카운트가 2이고 참조 플래그가 1입니다. $val을 $copy(3행)에 복사할 때 $val의 카운트가 1보다 크다는 것을 발견했습니다. 참조, 따라서 쓰기 시 변경이 필요합니다. 즉, 따라서 이 zval을 복사해야 합니다.
PHP7에서는 상황이 훨씬 간단해집니다. 먼저 $ref(line 2)에 참조를 할당하면 IS_REFERNCE 유형이 생성됩니다. 이때 이를 참조하는 두 개의 변수, zend_reference 구조의 참조 카운트 zval.value.ref->gc.refcount는 2입니다.
다시 값이 $copy에 할당되면(3행) ), $val이 참조인 것으로 밝혀졌으므로 $copy는 문자열 값이 laruence인 zval인 zval.value.ref->val을 가리키고, 그 다음 zval 참조 횟수 + 1, 즉 zval이 됩니다. .value.ref->val.value.str.gc.refcount는 2입니다. 복사가 생성되지 않습니다. 이렇게 하면 문제가 매우 잘 해결됩니다. 1장에서 언급한 PHP5의 고전적인 문제는 다음과 같습니다. 예를 들어 이전 장의 문제를 PHP7에서 실행하면 다음과 같은 결과가 나옵니다.
$ php-7.0/sapi/cli/php /tmp/1.php Used 0.00021380008539 Used 0.00020173048281
복사가 발생하지 않으므로 성능 문제가 발생하지 않습니다. #🎜🎜 #
추천: "PHP 튜토리얼
"위 내용은 PHP7 커널 참조에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alipay PHP ...

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...
