외부 함수 인터페이스
외부 함수 인터페이스 (Foreign Function Interface, FFI)
FFI 확장은 PHP에서 C 함수를 호출하고 C 데이터 구조에 접근할 수 있게 해주는 강력한 도구예요. 이 페이지에서는 FFI가 무엇인지, 어떤 특징과 주의점이 있는지 개요를 살펴봐요.
본문
이 확장은 공유 라이브러리(.DLL 또는 .so)를 로드하고, C 함수를 호출하며, C 데이터 구조에 접근하는 것을 순수 PHP에서 가능하게 해줍니다. Zend 확장 API에 대한 깊은 지식이 없어도, 또 세 번째 "중간(intermediate)" 언어를 배울 필요도 없이 말이죠. 공개 API는 단일 클래스 FFI에 여러 정적 메서드(일부는 동적으로 호출 가능)와, C 데이터와의 실제 상호작용을 수행하는 오버로드된 객체 메서드로 구현되어 있어요.
다만 FFI는 위험합니다. 시스템과 아주 낮은 수준(low level)에서 인터페이스하기 때문이에요. 그래서 FFI 확장은 C와 사용할 C API에 대한 실무 지식을 갖춘 개발자만 사용해야 합니다. 위험을 줄이기 위해 ffi.enable php.ini 지시어로 FFI API 사용을 제한할 수 있어요.
한 가지 짚어 두면, FFI 확장이 기존 PHP 확장 API를 대체하는 것은 아닙니다. 단지 C 함수와 데이터 구조에 임시로(ad-hoc) 인터페이스하기 위한 수단으로 제공되는 거예요.
성능 측면에서도 방향을 잘 잡아야 해요. 현재 FFI 데이터 구조에 접근하는 것은 네이티브 PHP 배열·객체보다 약 2배 정도 느립니다. 따라서 FFI를 "빠르게" 쓰려는 목적으로 쓰는 건 의미가 없어요. 다만 메모리 사용량을 줄이는 용도로는 의미가 있을 수 있습니다.
FFI가 제공하는 클래스와 함수는 다음과 같아요.
- FFI —
addr,alignof,arrayType,cast,cdef,free,isNull,load,memcmp,memcpy,memset,new,scope,sizeof,string,type,typeof - FFI\CData — C 데이터를 나타내는 클래스
- FFI\CType — C 타입을 나타내며,
getAlignment,getArrayElementType,getArrayLength,getAttributes,getEnumKind,getFuncABI,getFuncParameterCount,getFuncParameterType,getFuncReturnType,getKind,getName,getPointerType,getSize,getStructFieldNames,getStructFieldOffset,getStructFieldType메서드를 제공 - FFI\Exception과 FFI\ParserException — FFI 관련 예외 클래스