PHP 확장 개발 핵심
PHP 확장은 C 언어로 작성된 동적 라이브러리로, PHP 코어에 직접 통합되어 고성능 기능을 제공합니다. 시스템 API 호출, 성능 최적화, 전용 기능 구현이 가능하며 PHP 애플리케이션의 성능을 극대화합니다.
개발 환경 구성
PHP 소스 코드를 클론하고 빌드 환경을 설정합니다:
git clone https://github.com/php/php-src
cd php-src
./buildconf
./configure --enable-debug
make
확장 템플릿 생성
ext_skel 도구로 기본 확장 구조 생성:
cd ext
php ext_skel.php --ext=custom_ext --vendor=devteam
생성된 파일 구조:
config.m4- 빌드 설정php_custom_ext.h- 헤더 파일custom_ext.c- 메인 소스
코드 구조 분석
모듈 진입점 정의:
zend_module_entry custom_ext_module = {
STANDARD_MODULE_HEADER,
"custom_ext",
ext_functions,
NULL,
NULL,
PHP_RINIT(custom_ext),
NULL,
PHP_MINFO(custom_ext),
"1.0.0",
STANDARD_MODULE_PROPERTIES
};
사용자 함수 구현
PHP_FUNCTION(ext_check) {
ZEND_PARSE_PARAMETERS_NONE();
php_printf("%s 확장 동작 확인\n", "custom_ext");
}
PHP_FUNCTION(generate_msg) {
zend_string *input;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STR(input)
ZEND_PARSE_PARAMETERS_END();
zend_string *result = strpprintf(0, "입력값: %s", ZSTR_VAL(input));
RETURN_STR(result);
}
빌드 및 설치
cd ext/custom_ext
phpize
./configure
make
sudo make install
php.ini에 추가:
extension=custom_ext.so
고급 기법
메모리 관리
zend_string *buffer = zend_string_alloc(128, 0);
memcpy(ZSTR_VAL(buffer), "메모리 버퍼", 12);
ZSTR_LEN(buffer) = 12;
RETURN_STR(buffer);
에러 핸들링
php_error_docref(NULL, E_NOTICE, "잘못된 파라미터: %s", param_name);
RETURN_NULL();
리소스 관리
static int res_type;
res_type = zend_register_list_destructors_ex(
resource_cleaner, NULL, "custom_resource", MODULE_NUMBER
);
PECL 배포 절차
패키징:
pecl package package.xml
package.xml 예시:
<?xml version="1.0"?>
<package>
<name>custom_ext</name>
<summary>사용자 정의 PHP 확장</summary>
<description>고성능 기능 제공 확장 모듈</description>
</package>
PECL 제출:
pecl submit custom_ext-1.0.0.tgz
테스트 및 디버깅
테스트 케이스 작성 (.phpt):
--TEST--
기본 기능 테스트
--FILE--
<?php
echo ext_check();
?>
--EXPECT--
custom_ext 확장 동작 확인
GDB 디버깅:
gdb php
(gdb) b ext_check
(gdb) run tests/basic.phpt
성능 최적화
- Zend API 활용: 기본 API 최대한 활용
- 결과 캐싱: 반복 연산 결과 저장
- 메모리 사전 할당: 동적 할당 최소화
- 데이터 참조: 대용량 데이터 복사 방지
학습 자료
- 공식 문서:
php-src/docs - 예제 확장:
ext/skeleton - 표준 확장:
ext/curl,ext/json