PHP 개발에서 __halt_compiler ()는 언급이 적지 만 일부 시나리오에서는 매우 유용한 언어 구조입니다. PHP 통역사에게 "여기서 구문 분석 중지"를 지시하는 데 사용되므로 스크립트에서 따르는 모든 것을 건너 뜁니다. 이 메커니즘은 자체 추출 스크립트, 포장 도구 또는 사용자 정의 파일 형식 생성과 같이 해석 및 실행되지 않는 이진 또는 텍스트 데이터를 숨기거나 추가하는 데 사용될 수 있습니다. 이 기사는 __halt_compiler () 의 역할과 관련없는 코드 실행을 피하기 위해 올바르게 사용하는 방법을 자세히 소개합니다.
__halt_compiler () 는 언어 구조 (함수가 아님)이며 실행되면 PHP 통역사는 파일의 모든 후속 코드를 즉시 컴파일하는 중지됩니다. 이를 통해 일반적인 코드 실행에 영향을 미치지 않고 PHP 파일 끝에 비 PHP 데이터를 저장할 수 있습니다.
<?php
echo "Hello, World!";
__halt_compiler();
이것은 아닙니다PHP분석 내용。
위의 코드에서는 "안녕하세요, 세계!" 출력이되고 __halt_compiler () 이후의 텍스트는 실행, 구문 분석 또는 출력에 포함되지 않습니다.
개발자는 __HALT_COMPILER ()를 사용하여 자체 추출 스크립트를 구축하거나 리소스를 포함시킬 수 있습니다. 예를 들어, 구성 파일, 암호화 된 데이터 등을 포함하려면 PHP 파일 끝에서 다음과 같이 처리 할 수 있습니다.
<?php
$dataOffset = __COMPILER_HALT_OFFSET__;
$data = file_get_contents(__FILE__, false, null, $dataOffset);
// 당신은 할 수 있습니다$data추가 처리를하십시오,무수압이 있다면、분석 등
__halt_compiler();
// 이진 데이터 시작
일부 자동 생성 된 스크립트, 디버깅 정보, 경로, 토큰 등의 경우 __halt_compiler () 로 보호되지 않으면 실수로 실행되거나 누출 될 수 있습니다.
__halt_compiler () 자체는 후속 코드가 실행되는 것을 방지 할 수 있지만 실제로는 다음과 같은 점에주의를 기울여야합니다.
__halt_compiler () 가 포함 된 파일이 포함되거나 요구하는 다른 파일에서 참조되는 경우, PHP는 __halt_compiler ()를 실행할 때 나머지 코드의 구문 분석을 종료합니다. 이를 방지하기 위해 파일을 독립형 항목 파일로 설정하거나 상단 알림에 주석을 추가하는 것이 좋습니다.
// 이 파일을 포함하지 마십시오,독립형 작업을 통해 액세스해야합니다
__coded 오프셋이나 경로를 피하기 위해 접미사 데이터를 읽으려면 항상 __compiler_halt_offset__ 상수를 항상 사용하는 것이 좋습니다. 예를 들어:
$file = __FILE__;
$data = file_get_contents($file, false, null, __COMPILER_HALT_OFFSET__);
이 방법은 다른 환경에서 더 강력하고 배포에 더 강력하고 도움이됩니다.
PHP 파일 뒷면에 데이터를 저장하면 웹 서버에서 파일에 직접 공개적으로 액세스되지 않도록하십시오. 예를 들어 .htaccess 파일을 사용하여 액세스를 제한 할 수 있습니다.
<FilesMatch "secret\.php$">
Deny from all
</FilesMatch>
또는 파일을 비 공개 디렉토리에 배치하고 프로그램을 통해 액세스를 제어하십시오.
다음은 __halt_compiler ()를 사용하여 구성 데이터를 포함하는 자체 추출한 PHP 스크립트를 작성하는 방법을 보여주는 간단한 예입니다.
<?php
$configData = file_get_contents(__FILE__, false, null, __COMPILER_HALT_OFFSET__);
$config = unserialize($configData);
echo "데이터베이스 호스트: " . $config['db_host'];
__halt_compiler();
a:1:{s:7:"db_host";s:9:"gitbox.net";}
위의 코드에서는 구성 직렬화를 PHP 파일의 끝에 추가하고 런타임 사산화를 통해 구성 데이터를 얻습니다. 이것은 안전하고 유연합니다.
__HALT_COMPILER () 는 일일 개발에 자주 사용되는 기능이 아니지만 일부 고급 사용법에서는 매우 강력합니다. 특히 포장 스크립트 구축, 자료 임베드 및 PHP 실행 동작을 사용자 정의하는 것과 같은 시나리오에 적합합니다. 원칙을 마스터하고이를 잘 활용하면 코드 보안을 향상시킬뿐만 아니라 PHP 사용의 경계를 확대 할 수 있습니다.