Heim > php教程 > php手册 > 用C开发PHP扩展初探

用C开发PHP扩展初探

WBOY
Freigeben: 2016-06-06 19:53:48
Original
920 Leute haben es durchsucht

函数功能:php里面的整数是有符号数,其内部实现其实就是long,不是unsigned long。对于32位机器来说,php最大能表示的整数就是2^31-1了,一般在应用中碰到大于2^31-1而小于2^32的数就只能用字符串来表示了。对于mixed int_ext(string in)来说,如果字符串in

函数功能:php里面的整数是有符号数,其内部实现其实就是long,不是unsigned long。对于32位机器来说,php最大能表示的整数就是2^31-1了,一般在应用中碰到大于2^31-1而小于2^32的数就只能用字符串来表示了。对于mixed int_ext(string in)来说,如果字符串in表示的整数小于2^31-1,那么就返回整数,如果大于就返回字符串。

      开发扩展步骤如下:(首先需要下载php的源码,这里下载的是php-5.3.14)

    1,建立扩展骨架      

cd php-5.3.14/ext
./ext_skel --extname=int_ext
Nach dem Login kopieren

    2,修改编译参数

cd php-5.3.14/ext/int_ext
vi config.m4
Nach dem Login kopieren
去掉  PHP_ARG_ENABLE(int_ext, whether to enable int_ext support  和 
[ --enable-int_ext Enable int_ext support])  两行前面的dnl  修改后为:
1.	    dnl Otherwise use enable:  
2.	    PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,  
3.	    dnl Make sure that the comment is aligned:  
4.	    [  --enable-int_ext           Enable int_ext support])
Nach dem Login kopieren

    3,编写C代码

cd php-5.3.14/ext/int_ext
vi php_int_ext.h
#在 PHP_FUNCTION(confirm_int_ext_compiled); 后面新增一行 PHP_FUNCTION(int_ext);
Nach dem Login kopieren
cd php-5.3.14/ext/int_ext
vi int_ext.c
#在PHP_FE(confirm_int_ext_compiled, NULL)  后面添加  PHP_FE(int_ext, NULL)添加后为:
1.   zend_function_entry int_ext_functions[] = {  
2.	PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */  
3.	PHP_FE(int_ext, NULL)              /* For testing, remove later. */  
4.	{NULL, NULL, NULL}             /* Must be the last line in int_ext_functions[] */  
5.   }; 
Nach dem Login kopieren

核心代码:

PHP_FUNCTION(int_ext)
{
    char * str = NULL;
    int str_len;
    int argc = ZEND_NUM_ARGS();
    if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)
        return ;
    char * result;
    int result_length = str_len;
    result = (char *) emalloc(result_length + 1);
    memcpy(result,str,result_length);
    unsigned long result_num = strtoul(result, NULL, 10);
    int sizeoflong  sizeof(long);
    unsigned long max_long = 1 <p>    4,编译</p><pre class="brush:php;toolbar:false">cd php-5.3.14/ext/int_ext
/usr/local/php/bin/pphpize
./configure --with-php-config=/usr/local/php/bin/php-config
make 
make install
Nach dem Login kopieren
此时会产生一个so文件:  /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/int_ext.so

修改php.ini 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

[int_ext]

extension = int_ext.so

   5,测试

$a = int_ext("12345678900");
var_dump($a);
$a = int_ext("123456789");
var_dump($a);
Nach dem Login kopieren

结果输出:

string(11) "12345678900"
int(123456789)
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage