일반적으로 말하면 PHP는 이미 상대적으로 빠릅니다. 그러나 일부 고급 개발자의 경우 더 빠른 속도를 추구하려면 자체 C 코드를 작성하여 동적 링크 라이브러리로 컴파일할 수 있습니다. 일반적으로 .so 파일), PHP는 새로운 확장(확장)을 생성하고 확장에서 .so 파일을 호출하는 동시에 PHP 함수 인터페이스를 외부 세계에 노출합니다.
실제 사용에서는 함수 인터페이스를 호출하는 한 기본적으로 더 빠른 C 함수 서비스를 사용할 수 있습니다.
1. 동적링크 라이브러리(공유)
동적 링크 라이브러리의 파일 이름 접미사는 일반적으로 ".so"입니다. Windows 시스템에서는 파일 이름 접미사가 ".dll"입니다.
프로그램이 동적 링크 라이브러리와 링크되어 있는 경우, 프로그램 실행 시 해당 동적 링크 라이브러리 파일을 찾아야 합니다.
동적 링크 라이브러리를 사용하여 컴파일된 프로그램을 실행하려면 해당 동적 링크 라이브러리 파일을 실행 시 사용자 컴퓨터에 설치해야 프로그램이 해당 라이브러리를 로드할 수 있습니다.
정적 링크 라이브러리를 사용하는 프로그램을 사용하는 것만큼 편리해 보이지는 않지만 프로그램 크기를 줄이는 데는 도움이 됩니다. 많은 프로그램에서 사용될 라이브러리의 경우 동적 연결을 사용하면 이점이 훨씬 더 분명해집니다.
동적링크 라이브러리 제작:
gcc -shared -fPIC -o libmylib.so mylib.c ; # 编译成为shared library
AMD64에서는 -fPIC 옵션이 필요하지만 다른 플랫폼에서는 필요하지 않습니다.
동적 링크 라이브러리에 정적 링크 라이브러리 포함
동적 링크 라이브러리를 컴파일할 때 정적 라이브러리를 링크하고 링크 라이브러리의 내용을 동적 라이브러리에 포함시켜 컴파일해야 하는 경우 -Wl, --whole-archive 옵션을 사용할 수 있습니다.
예:
gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \ -Wl,--no-whole-archive libother.a
위의 -Wl은 링커(링커)에 전달된다는 의미입니다.
2. 동적 C/C 링크 라이브러리 호출
아래에서 본 글의 개발 환경 배경은 CentOS 릴리스 6.5입니다. c 라이브러리를 호출할 수 있도록 php 5.6.9 및 apache 2.4를 소스 코드에서 다운로드하여 컴파일하며 yum!을 통해 직접 설치할 수 없습니다. 주의하시기 바랍니다. PHP와 Apache의 소스 코드 컴파일에 대해서는 이 기사에서 언급하지 않을 것입니다. 단지 구성에서 적절한 스위치를 켜는 것에 주의하십시오.
구체적인 단계는 다음과 같습니다.
공유 라이브러리.so를 시스템 구성에 추가합니다(공유 라이브러리 이름이 'libhello.so'라고 가정).
cp libhello.so /usr/local/lib echo /usr/local/lib > /etc/ld.so.conf.d/local.conf /sbin/ldconfig
php/ext 디렉토리에 확장 헤더 파일을 생성하고 이름을 myfunctions.def로 지정하세요
이 파일에 c 함수 선언을 입력하기만 하면 됩니다. 함수당 한 줄.
string hello(int a) int hello_add(int a, int b)
ext_skel을 사용하여 확장된 뼈대 구축
./ext_skel --extname=myfunctions --proto=myfunctions.def
config.m4에서 활성화 스위치를 켜세요
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, [ --enable-myfunctions Include myfunctions support])
위에서 확장 스켈레톤이 설정되었고, 아래에서 php가 재구성되었습니다. (다음은 제 개인 설정 파일로, 독자분들의 상황에 맞게 수정하셔야 합니다.)
./buildconf --force //生成新配置脚本 './configure' '--prefix=/usr/local/php' '--with-libdir=lib64' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=www--enable-mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-opcache' '--enable-pcntl' '--enable-mbstring' '--enable-soap' '--enable-zip' '--enable-calendar' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-intl' '--with-openssl' '--with-zlib' '--with-curl' '--with-gd' '--with-zlib-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-jpeg-dir=/usr/lib' '--with-gettext' '--with-mhash' '--with-ldap' '--disable-fileinfo' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/httpd/bin/apxs' '--enable-myfunctions' // 配置
기억하세요! 끝에 —enable-myfunctions를 추가해야 합니다. 이 방법으로만 PHP로 컴파일됩니다.
확장이 컴파일된 후 확장에서 myfunctions.c 파일 수정을 시작할 수 있습니다. 여기에 php->c 전송 함수를 추가하고 전송 함수에서 .so의 함수를 호출할 수 있습니다.
예를 들어, hello_add PHP 함수를 추가하려면 c 함수 add(int a, int b)
를 호출하면 됩니다.
a. 함수 선언 추가
PHP_FE(hello_add, NULL)
b.php 기능 추가
PHP_FUNCTION(hello_add){ ... }
이 함수에서 .so 파일의 인터페이스 함수가 호출되면 작성 시 사용되는 .so 공유 라이브러리를 1단계에서 .so 파일에 추가해야 합니다. 시스템 구성 작업.
.so 파일이 호출되면
을 php/Makefile에 추가하세요.
Extra_LDFLAG = -lhello //对应前面的libhello.so Extra_libs = -lhello (make clean)
위의 c파일을 수정할 때마다 다시 만들어야 합니다
make make install
아파치 서버 다시 시작
httpd -k restart
phpinfo에서 새로운 확장 기능을 확인할 수 있고, php에서 새로운 확장 기능에 포함된 함수를 직접 호출할 수 있습니다.