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>
'개발 꿀팁 > PHP' 카테고리의 다른 글
php 비동기 호출 방법 (0) | 2022.08.19 |
---|---|
php 생성자가 다른 개수 매개 변수를 지원하는 방법 (0) | 2022.08.19 |
php 짧은 URL 생성 (0) | 2022.08.18 |
php soap 사용 사례 (0) | 2022.08.18 |
php unserialize false 해결 방법 반환 (0) | 2022.08.17 |