PHP 설치에 FFI 확장이 활성화되어 있는지 확인하십시오. php.ini 파일을 수정하고 다음 구성을 추가 할 수 있습니다.
ffi.enable=1
다음으로 C 구조 정의가 필요합니다.
typedef struct {
int id;
float value;
} Item;
우리는 PHP의 C 선언을 통해이 구조를 정의하고 다양한 구조를 작동시킬 것입니다.
$ffi = FFI::cdef("
typedef struct {
int id;
float value;
} Item;
void *memcpy(void *dest, const void *src, size_t n);
", "libc.so.6"); // Linux 아래에 libc 길,Windows 아래에可能需要改为 "msvcrt.dll"
우리는 다양한 구조를 만들고 여러 요소를 초기화합니다.
$length = 3;
$items1 = $ffi->new("Item[$length]");
$items1[0]->id = 1;
$items1[0]->value = 3.14;
$items1[1]->id = 2;
$items1[1]->value = 2.71;
$items1[2]->id = 3;
$items1[2]->value = 1.62;
대상 배열에 대한 메모리를 먼저 할당 한 다음 메모리 복사에 memcpy를 사용해야합니다.
$items2 = $ffi->new("Item[$length]");
// 총 바이트 수를 계산하십시오:각 구조의 크기는 숫자를 곱합니다.
$size = FFI::sizeof($items1);
// 사용 memcpy 메모리 복사
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);
for ($i = 0; $i < $length; $i++) {
echo "Item {$i}:\n";
echo " ID: " . $items2[$i]->id . "\n";
echo " Value: " . $items2[$i]->value . "\n";
}
출력은 다음과 같습니다.
Item 0:
ID: 1
Value: 3.14
Item 1:
ID: 2
Value: 2.71
Item 2:
ID: 3
Value: 1.62
Memcpy 는 바이트에 의해 복사되어 대상 메모리 영역이 충분한 공간으로 할당되도록합니다.
ffi :: sizeof는 어레이에 의해 점유되는 바이트 크기를 얻기 위해 안전하게 사용될 수 있습니다.
스크립트 호출을 통해 PHP FFI 코드를 실행하려면 명령 줄에서 php -dffi.enable = 1 Yourfile.php를 사용해야합니다.
일부 플랫폼 (예 : MacOS 또는 Windows)에서 C 표준 라이브러리 파일 이름은 다르며 CDEF 의 라이브러리 이름은 실제 경로에 따라 수정되어야합니다.