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 파일을 의미 함).
도구 모음을 설정하는 것을 잊지 마십시오.
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에 다음 정보가 표시되어야 합니다.
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"
등록된 댓글이 없습니다.