>  기사  >  백엔드 개발  >  Linux에서 C를 사용하여 PHP를 확장하는 방법(패키지 포함)

Linux에서 C를 사용하여 PHP를 확장하는 방법(패키지 포함)

WBOY
WBOY원래의
2016-08-08 09:21:271250검색

이 기사에서는 주로 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
참고, 일부 이전 버전에는 소스 코드 패키지가 없으므로 소스 코드 패키지를 제공하는 버전으로 PHP를 업그레이드해야 합니다.

3. /php-5.6.9/ext/ 디렉토리로 이동하여 ext_skel을 사용하여 확장 스켈레톤을 생성합니다.

cd ./php-5.6.9/ext
./ext_skel --extname=test

4. 구성 파일 /test/config.m4

를 수정합니다. Dnl 주석 다음 두 줄을 취소합니다.

PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
[  --enable-test           Enable test support])

컴파일에 C++를 사용하려면 test.c의 이름을 test.cpp로 바꾸고 config.m4에 추가하세요.
PHP_REQUIRE_CXX()    
PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS)
PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)

5. php_test.h 파일에 코드를 추가하고 사용자 정의 함수 선언을 추가합니다.
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);

6. test.c/cpp에 사용자 정의 함수 코드를 추가합니다:

(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"
함수 재정의에 많은 문제가 있습니다. 자세한 내용은 다른 블로그(http://blog.csdn.net/maverick1990/article/details/46786685)를 참조하세요.

(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[] */
};

위치에 함수 항목을 추가합니다. (3) 마지막으로 파일 끝에 testFunc 함수의 코드를 추가합니다. 다른 사용자 정의도 정의할 수 있습니다. 여기에 기능이 있습니다.
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
9. /root/php-5.6.9/ext/test/ 디렉토리로 이동하여 구성을 생성합니다.
./configure --with-php-c/local/php/bin/php-config

10.so 확장 파일을 컴파일하고 생성합니다.
make
make install
오류가 발생했습니다. 컴파일이 통과될 때까지 코드를 수정하세요.

make install에 오류가 있으면 수정 후 현재 생성된 확장 모듈을 지워야 합니다.

phpize --clean

그런 다음 7단계부터 다시 시작하세요.

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"

13. PHP 서비스 다시 시작
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

이것은 컴파일된 .so 파일의 PHP 소스 코드 패키지 버전과 현재 사용되는 PHP 버전의 차이로 인해 발생합니다. 현재 버전의 PHP 소스 코드 패키지를 다운로드하고 확장자를 다시 컴파일해야 합니다. 🎜>
저작권 표시: 이 글은 해당 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.

위 내용은 관련 내용을 포함하여 Linux에서 PHP를 확장하기 위해 C를 사용하는 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.