현재 위치: > 최신 기사 목록> FFI :: PHP에서 C- 언어 구조 어레이를 복사하는 Memcpy 구현

FFI :: PHP에서 C- 언어 구조 어레이를 복사하는 Memcpy 구현

gitbox 2025-06-06

1. 환경 준비

PHP 설치에 FFI 확장이 활성화되어 있는지 확인하십시오. php.ini 파일을 수정하고 다음 구성을 추가 할 수 있습니다.

 ffi.enable=1

다음으로 C 구조 정의가 필요합니다.

 typedef struct {
    int id;
    float value;
} Item;

우리는 PHP의 C 선언을 통해이 구조를 정의하고 다양한 구조를 작동시킬 것입니다.


2. FFI를 사용하여 PHP의 구조를 선언합니다

 $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"

3. 구조 배열을 만들고 초기화하십시오

우리는 다양한 구조를 만들고 여러 요소를 초기화합니다.

 $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;

4. ffi :: memcpy를 사용하여 구조 배열을 복사하십시오

대상 배열에 대한 메모리를 먼저 할당 한 다음 메모리 복사에 memcpy를 사용해야합니다.

 $items2 = $ffi->new("Item[$length]");

// 총 바이트 수를 계산하십시오:각 구조의 크기는 숫자를 곱합니다.
$size = FFI::sizeof($items1);

// 사용 memcpy 메모리 복사
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);

V. 사본 결과를 확인하십시오

 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

6. 주목할만한 것들

  1. Memcpy 는 바이트에 의해 복사되어 대상 메모리 영역이 충분한 공간으로 할당되도록합니다.

  2. ffi :: sizeof는 어레이에 의해 점유되는 바이트 크기를 얻기 위해 안전하게 사용될 수 있습니다.

  3. 스크립트 호출을 통해 PHP FFI 코드를 실행하려면 명령 줄에서 php -dffi.enable = 1 Yourfile.php를 사용해야합니다.

  4. 일부 플랫폼 (예 : MacOS 또는 Windows)에서 C 표준 라이브러리 파일 이름은 다르며 CDEF 의 라이브러리 이름은 실제 경로에 따라 수정되어야합니다.