이 기사에서는 주로 Linux와 Windows에서 C 확장 .so 파일 패키징 간의 차이점에 대해 설명합니다. 자세한 코드 및 구성 계획은 다른 블로그(http://blog.csdn.net/maverick1990/article /details/)를 참조하세요. 46519045
단계:
1. /usr/local/php/ 디렉토리에 PHP 환경을 설치합니다.
2. 동일한 버전의 PHP 소스 코드 패키지를 다운로드합니다. , /root/php-5.6.9/ 디렉토리에 설치되며, 공식 웹사이트 http://www.php.net/downloads.php
다음 명령을 실행하세요:
cd /root wget http://us1.php.net/distributions/php-5.6.9.tar.bz2 tar -xf php-5.6.9.tar.bz2
3. /php-5.6.9/ext/ 디렉토리로 이동하여 ext_skel을 사용하여 확장 스켈레톤을 생성합니다.
cd ./php-5.6.9/ext ./ext_skel --extname=test
를 수정합니다. Dnl 주석 다음 두 줄을 취소합니다.
PHP_ARG_ENABLE(test, whether to enable test support, dnl Make sure that the comment is aligned: [ --enable-test Enable test support])
PHP_REQUIRE_CXX() PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS) PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)
PHP_MINIT_FUNCTION(test); PHP_MSHUTDOWN_FUNCTION(test); PHP_RINIT_FUNCTION(test); PHP_RSHUTDOWN_FUNCTION(test); PHP_MINFO_FUNCTION(test); PHP_FUNCTION(confirm_test_compiled); /* For testing, remove later. */ PHP_FUNCTION(testFunc);
(1) 먼저 이 위치에서 사용되는 헤더 파일을 소개합니다:
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <string.h> #include <math.h>
#include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_test.h"
(2) 그런 다음
const zend_function_entry test_functions[] = { PHP_FE(confirm_test_compiled, NULL) /* For testing, remove later. */ PHP_FE(testFunc, NULL) PHP_FE_END /* Must be the last line in test_functions[] */ };
PHP_FUNCTION(testFunc) { char *x = NULL; char *y = NULL; int argc = ZEND_NUM_ARGS(); int x_len; int y_len; if (zend_parse_parameters(argc TSRMLS_CC, "ss", &x, &x_len, &y, &y_len) == FAILURE) return; int result_length = x_len + y_len; char* result = (char *) emalloc(result_length + 1); strcpy(result, x); strcat(result, y); RETURN_STRINGL(result, result_length, 0); }
PHP_FUNCTION 함수 작성 방법에 대한 자세한 내용은 블로그를 참조하세요: http://weizhieng.net/write-php-extension-part2-1.html
7. /root/php-5.6.9/ext/test/ 디렉토리에서 php 확장 모듈을 생성합니다:
phpize
/usr/local/php/bin/phpize
8. /root/php-5.6.9/ 디렉토리로 돌아가서 컴파일에 필요한 구성을 다시 설정하세요.
cd ../.. ./buildconf --force
유사한 오류가 발생하는 경우:
buildconf: You need autoconf 2.59 or lower to build this version of PHP. You are currently trying to use 2.63 Most distros have separate autoconf 2.13 or 2.59 packages. On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist. Install autoconf2.13 and set the PHP_AUTOCONF env var to autoconf2.13 and try again.
yum install autoconf213 export PHP_AUTOC/bin/autoconf-2.13
./configure --with-php-c/local/php/bin/php-config
make make install
make install에 오류가 있으면 수정 후 현재 생성된 확장 모듈을 지워야 합니다.
phpize --clean
11. test.so가 생성되었는지 확인하세요
make install이 성공하면 생성 경로가 제공됩니다. 예: /usr/local/php/lib/php/extensions/no-debug -non-zts- 20131226/test.so
12. php.ini 수정
/usr/local/php/etc/php.ini 파일을 수정하고 확장자 경로와 이름을 추가합니다. :
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/" extension = "teste.so"
service php-fpm restart
14. PHP에서 C++ 확장 기능 사용
<?php $concat_str = testFunc("concat1","concat2"); echo $concat_str; ?>
PHP Warning PHP Startup Unable to initialize module Module compiled with module API=20121212 PHP compiled with module API=20090626 These options need to match in Unknown on line 0