개발 꿀팁/PHP

C를 사용하여 php 확장 만들기

Jammie 2022. 8. 19. 11:32
반응형

C를 사용하여 php 확장 만들기

장점:

1.운행 효율을 높이다.

2.php 복잡도를 낮추고,확장 방법 구현 기능을 직접 호출할 수 있다.

3.서드파티 라이브러리와 상호 작용하기 편리。



단점:

1. 개발은 php보다 복잡하다.

2.유지보수성이 떨어집니다.

3.개발 주기가 길어진다.php 개발, 발견문제가 발생한 후에 문제를 수리하면 된다.즉, 효과를 볼 수 있습니다.확장을 사용할 경우 복구 후 다시 컴파일하여 다시 시작해야 합니다.반드시 효과를 볼 수 있어야 한다.



우선, 하나를 실현해야 한다고 가정하자.방법:url 문자열을 하이퍼링크로 변환하기。

php 구현 방법:

<?php
 
function strtolink($url, $name='', $openwin=0){
    $name = $name==''? $url : $name;
    $openwin = $openwin==1? ' target="_blank" ' : '';
    return '<a href="'.$url.'" '.$openwin.'>'.$name.'</a>';
}
 
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1);
 
?>

이제 이 방법의 확장을 위해 C를 사용합니다. php 확장을 위해서는 php 설치 패키지의 /ext/, 예를 들어 php-5.3.15/ext/ext_skel을 사용하는 ext_xt_skel
1. skel 파일을 만들고 strtolink.skel로 저장하기

string strtolink(string url, string name, int openwin)

2.확장 프레임 만들기

./ext_skel --extname=strtolink --proto=strtolink.skel
cd strtolink

3.프로파일 변경 config.m4

이 10, 11, 12 세 줄 앞에 있는 dnl을 제거합니다.
dnlPH_ARG_WITH(strtol)ink, for strtolink support,
dnl Make sure that the comment is aligned:
dnl [-- with-strtolink] Include strtolink support])

즉, 다음과 같이 수정한다:
PH_ARG_WITH(strtolink, for strtolink support,
Make sure that the comment is aligned:
[---with-strtolink] Include strtolink support])

4.기능 구현, strtolink.c 수정, PHP_FUNCTION(strtolink) 이 방법을 다음과 같이 수정한다

PHP_FUNCTION(strtolink)
{
        char *url = NULL;
        char *name = NULL;
        int argc = ZEND_NUM_ARGS();
        int url_len;
        int name_len;
        long openwin = 0;
        char *opentag;
        char *result;
 
        if (zend_parse_parameters(argc TSRMLS_CC, "s|sl", &url, &url_len, &name, &name_len, &openwin) == FAILURE)
                return;
 
        if (name == NULL || strlen(name)==0){
                name = url;
        }
 
        if (openwin == 1){
                opentag = " target=\"_blank\" ";
        }else{
                opentag = "";
        }
 
        url_len = spprintf(&result, 0, "<a href=\"%s\" %s>%s</a>", url, opentag, name);
 
        RETURN_STRINGL(result, url_len, 0);
 
        php_error(E_WARNING, "strtolink: not yet implemented");
}

5.컴파일 확장

phpize
sudo ./configure
sudo make
sudo make test

make error: 'PHP_FE_END' undeclared here (not in a function)
다음 문장으로 해결한 다음 다시 컴파일합니다

sed -i 's|PHP_FE_END|{NULL,NULL,NULL}|' ./strtolink.c  
sed -i 's|ZEND_MOD_END|{NULL,NULL,NULL}|' ./strtolink.c

성공 후 strtolink/ modules에서 strtolink.so 파일을 찾습니다


6.확장 추가
phpinfo의 e를 통해서 strtolink.so를 php 확장 디렉터리에 복사합니다.xtension_dir 확장 디렉터리 위치 보기

sudo cp strtolink.so /usr/lib/php5/20090626/strtolink.so

php.ini 수정, extension="strtolink.so" 마지막에 추가
apache를 다시 시작합니다. phpinfo에 새로운 확장 strtolink가 나타납니다

7.확장 사용

이전 php 되돌리기strtolink function만 제거하면 된다.이 방법은 확장 구현되어 있으며 직접 호출할 수 있습니다

<?php
 
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 0)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog')."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', '', 1)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', '')."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', NULL, NULL)."\r\n";
 
?>

출력:

<a href="http://blog.csdn.net/fdipzone"  target="_blank" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone"  target="_blank" >http://blog.csdn.net/fdipzone</a>
<a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a>
<a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a>

 

반응형