FFI로 PHP 속도 향상

7470 단어 ffispeedphp
FFI로 PHP 속도 향상

FFI는 확장을 만들지 않고 외부 라이브러리(.so 또는 .dll)를 사용할 수 있게 해주는 실험적 확장입니다. 이 라이브러리는 각 요청별로 미리 로드하거나 로드할 수 있습니다. 미리 로드된 상태로 실행하는 것이 좋지만 요청별로 로드하기 쉽습니다.
  • What we could do with FFI?

  • 1) Creating the library
  • Code
  • Compilation

  • 2) MinGW64
  • 3) Configuring PHP
  • 4) Our PHP code (First alternative)
  • 5) Our PHP Code (Second alternative)

  • FFI로 무엇을 할 수 있습니까?



    예를 들어 C, C++, Rust 또는 라이브러리(C 스타일)를 만들 수 있는 거의 모든 언어를 사용할 수 있습니다. 그것은 우리의 성능을 10배로 향상시킬 수 있습니다. 내 초기 테스트에서 double이 포함된 간단한 루프는 기본 PHP보다 800% 빠르게 실행됩니다.

    1) 라이브러리 생성



    이 예에서는 툴체인으로 CLion(ide),mingw64를 사용하지만 모든 ide 또는 툴체인을 사용할 수 있습니다. 저도 윈도우를 사용합니다.

    C용 공유 라이브러리를 생성합니다(공유는 .so 또는 .dll 파일을 의미합니다).



    툴체인을 설정하는 것을 잊지 마십시오.



    암호



    library.c

    #include "library.h"
    
    const char* ping(const char *pong) {
        return pong;
    }
    


    이 코드는 간단합니다. 문자열 인수가 있는 간단한 함수가 있고 동일한 문자열을 반환합니다. 즉, 퐁퐁 함수입니다.

    library.h

    #define FFI_SCOPE "MYLIB"
    #define FFI_LIB "C:\CLionProjects\untitled\cmake-build-debug\libuntitled.dll"
    
    const char* ping(const char *pong);
    


    FFI_LIB의 값은 무엇입니까? 라이브러리(DLL 정도)가 컴파일되는 경로입니다. 우리는 컴파일되지 않았지만 편집해야 합니다. 따라서 지금 당장은 어떤 값이든 쓸 수 있습니다.

    FFI_SCOPE는 라이브러리의 "범위"(즉, 일종의 네임스페이스)이기도 합니다.

    편집



    그것은 우리의 편집입니다

    ====================[ Build | all | Debug ]=====================================
    "D:\Program Files\JetBrains\CLion 2020.2\bin\cmake\win\bin\cmake.exe" --build C:\CLionProjects\untitled\cmake-build-debug --target all -- -j 9
    Scanning dependencies of target untitled
    [ 50%] Building C object CMakeFiles/untitled.dir/library.c.obj
    [100%] Linking C shared library libuntitled.dll
    [100%] Built target untitled
    
    Build finished
    


    그리고 일부 경로에서 라이브러리가 올바르게 컴파일되는 위치를 찾았습니다. 이제 .h 파일을 편집하고 올바른 경로를 입력할 수 있습니다. PHP에서 .h를 직접 사용하려면 이렇게 해야 합니다.

    2) 민GW64



    (선택사항) MinGW 툴체인을 사용하고 있습니다. 여기에는 GCC 라이브러리 및 기타 항목이 포함됩니다. 그들의 라이브러리를 사용하고 싶다면 경로에 추가하거나 우리 안에 라이브러리를 포함시킬 수 있습니다.

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.17)
    project(untitled7)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_EXE_LINKER_FLAGS "-static")
    
    set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
    set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
    
    
    add_library(untitled7 SHARED library.cpp library.h)
    


    C용 -static-libgcc 또는 C++용 -static-libstdc++(또는 둘 다) 행을 추가해야 합니다.

    3) PHP 구성



    먼저 FFI 확장을 설치하고 활성화해야 합니다. PHP 7.4 이상이 필요합니다.

    Linux를 사용하는 경우 FFI 확장으로 다시 컴파일해야 합니다.

    php.ini

    extension=ffi
    [ffi]
    ffi.enable=true
    


    참고: 웹 서버를 다시 시작하는 것을 잊지 마십시오.

    FFI를 미리 로드할 수 있지만 이 예에서는 요청별로 로드합니다.

    PHPInfo는 다음 정보를 표시해야 합니다.



    4) PHP 코드(첫 번째 대안)



    FFI::cdef 및 FFI:load를 사용하여 코드를 호출하는 두 가지 방법이 있습니다. FFI::cdef에는 라이브러리와 정의가 필요합니다.

    <?php
    
    $file='C:\CLionProjects\untitled\cmake-build-debug\libuntitled.dll'; // the path of our dll
    $ffi=FFI::cdef('const char* ping(const char *pong);',$file);
    
    var_dump($ffi->ping("hello world")); // string(11) "hello world"
    


    5) 우리의 PHP 코드(두 번째 대안)



    두 번째 대안은 코드에 정의된 .h 파일을 사용하는 것입니다. 이 코드는 .h 파일에 다음 줄이 있어야 합니다.

    #define FFI_SCOPE "MYLIB"
    #define FFI_LIB "C:\CLionProjects\untitled\cmake-build-debug\libuntitled.dll"
    


    그리고 다음과 같이 코드를 호출할 수 있습니다.

    <?php
    
    $hfile='C:\CLionProjects\untitled\library.h'; // the path of our .h file.
    $r2=FFI::load($hfile);
    var_dump($r2->ping("hello world")); // string(11) "hello world"
    

    좋은 웹페이지 즐겨찾기