FFI로 PHP 속도 향상
FFI는 확장을 만들지 않고 외부 라이브러리(.so 또는 .dll)를 사용할 수 있게 해주는 실험적 확장입니다. 이 라이브러리는 각 요청별로 미리 로드하거나 로드할 수 있습니다. 미리 로드된 상태로 실행하는 것이 좋지만 요청별로 로드하기 쉽습니다.
1) Creating the library
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"
Reference
이 문제에 관하여(FFI로 PHP 속도 향상), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jorgecc/speeding-php-with-ffi-5gn0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)