07 build your-own_php_extension

27
Build your own PHP Extension Hanoi PHP Day 2010 Bui Dinh Ngoc AiTi-Aptech - CAH Trường đào tạo Lập trình viên Quốc tế AiTi-Aptech

Upload: nguyen-duc-phu

Post on 24-May-2015

638 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 07 build your-own_php_extension

Build your own PHP Extension

Hanoi PHP Day 2010                    

Bui Dinh NgocAiTi-Aptech - CAH

Trường đào tạo Lập trình viên Quốc tế AiTi-Aptech

Page 2: 07 build your-own_php_extension

PHP Extension ?

Page 3: 07 build your-own_php_extension

PHP Extension

• You've used extensions ?• php_mysql , gd , pdo , curl ,  ...•  

Page 4: 07 build your-own_php_extension

PHP Extension (Zend Engine)• PHP language  written in  C • PHP interpreter written in  C too• And PHP Extension must   written in  C• Another PHP implement may be using diffrence language

Page 5: 07 build your-own_php_extension

Why and When need PHP extension ?1. Buildin PHP function are not enough 2. Existing PHP extension are not enough 3. Pure PHP function are more slow4. Have C lib can do this for you

Page 6: 07 build your-own_php_extension

Prepare 

1. Ubuntu Linux 2. GNU C Compiler , build , make utils  3.  PHP 5 Dev package : sudo apt-get install php5-dev4. PHP source code 

o sudo svn checkout  http://svn.php.net/viewvc/php/php-src/trunk

o  

Page 7: 07 build your-own_php_extension

PHP-Src-5.3 tree directory

 

Page 8: 07 build your-own_php_extension

ext_skel.sh script

 

Page 9: 07 build your-own_php_extension

Write Hello World Extension//Example function call <?php

function hello_world() {    return 'Hello World';}

?>

Page 10: 07 build your-own_php_extension

 

1. Run ext_skel script : sudo ./ext_skel –extname=hello2.  

Page 11: 07 build your-own_php_extension

Result

 

Page 12: 07 build your-own_php_extension

phpize

The phpize command is used to prepare the build environment for a PHP extension.  

Page 13: 07 build your-own_php_extension

 

 

Page 14: 07 build your-own_php_extension

Edit header file php_hello.h

Page 15: 07 build your-own_php_extension

Insert your function to header filePHP_FUNCTION(hello);  /*My function here*/

Page 16: 07 build your-own_php_extension

Edit C source file - pre declareconst zend_function_entry simhash_functions[] = {PHP_FE(confirm_hello_compiled,    NULL)        /* For testing, remove later. */PHP_FE(hello, NULL){NULL, NULL, NULL}    /* Must be the last line in hello_functions[] */};

Page 17: 07 build your-own_php_extension

Implement function

PHP_FUNCTION(hello){php_printf(“Hello, world!\n”);}

Page 18: 07 build your-own_php_extension

Build - Run some script

1. sudo ./configure2. sudo make3. ls modules -> hello.so

Page 19: 07 build your-own_php_extension

Test

1. Deploy file hello.so2. Check new extension is loaded by phpinfo function 3. You also can test using existed hello.php script in ext dir

Page 20: 07 build your-own_php_extension

Advance !

1. Build php function with parameter2. Return value3. Memory allocation 4. Anti Memory leak5. Array6. String7. Global variable8. PHP.INI variable9. ........

Page 21: 07 build your-own_php_extension

Function with parameter

function hello_add($a, $b) {

    $sum = (int)$a + (float)$b;

    return $sum;}

Page 22: 07 build your-own_php_extension

Function with parameter

PHP_FUNCTION(hello_add){    long a;    double b; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ld", &a, &b) == FAILURE) {        RETURN_NULL();    }

            RETURN_DOUBLE(a + b);    }

Page 23: 07 build your-own_php_extension

Return value

1. bool2. int3. double4. resource5. array6. object

Only 6 return type

Page 24: 07 build your-own_php_extension

Return value (macro)

RETURN_LONG() for integer valuesRETURN_DOUBLE() for floating point valuesRETURN_BOOL() for true/false valuesRETURN_NULL() for null value.....  

Page 25: 07 build your-own_php_extension

Memory allocation

 

Page 26: 07 build your-own_php_extension

Anti Memory leak

• In C, memory management always very hard  .• Wrapper functions provides you with a safety net and some

helpful debugging facilities• But convert existing C source can't use wrapper functions

 

Page 27: 07 build your-own_php_extension

Reference

1. http://i-php.net/2010/10/t-build-extension-cho-php/2. http://devzone.zend.com/article/10213. "Programming PHP" by Rasmus Lerdorf and Kevin