댓글 검색 목록

[php] FFI로 PHP 속도 향상

페이지 정보

작성자 운영자 작성일 20-08-28 18:30 조회 815 댓글 0

FFI로 PHP 속도 향상 


FFI는 확장을 만들지 않고도 외부 라이브러리 (.so 또는 .dll)를 사용할 수 있는 실험적 확장입니다. 이 라이브러리는 각 요청마다 미리 로드 되거나 로드 될 수 있습니다. 미리 로드 된 상태로 실행하는 것이 좋지만 요청 당 로드하기 쉽습니다.


https://dev.to/jorgecc/speeding-php-with-ffi-5gn0


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


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


1) 라이브러리 생성 


이 예에서는 CLion (ide), mingw64를 도구 모음으로 사용하지만 모든 ide 또는 도구 모음을 사용할 수 있습니다. Windows도 사용합니다.


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


Alt Text 


도구 모음을 설정하는 것을 잊지 마십시오.


Alt Text 



Code 


library.c


#include "library.h"

const char* ping(const char *pong) {
    return pong;
}


이 코드는 간단하며 문자열 인수가 있는 간단한 함수가 있으며 동일한 문자열을 반환합니다. 즉, pong-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) MinGW64 


(선택 사항) 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) Configuring PHP 


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


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


php.ini

extension=ffi
[ffi]
ffi.enable=true


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


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

PHPInfo에 다음 정보가 표시되어야 합니다.


Alt Text 


4) Our PHP code (First alternative) 


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) Our PHP Code (Second alternative) 


두 번째 대안은 코드에 정의 된 .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"




댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.