Build your own PHP extension

Preview:

Citation preview

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

PHP Extension ?

PHP Extension

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

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

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

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  

PHP-Src-5.3 tree directory

 

ext_skel.sh script

 

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

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

?>

 

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

Result

 

phpize

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

 

 

Edit header file php_hello.h

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

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

Implement function

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

Build - Run some script

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

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

Advance !

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

Function with parameter

function hello_add($a, $b) {

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

    return $sum;}

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);    }

Return value

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

Only 6 return type

Return value (macro)

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

Memory allocation

 

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

 

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 

 

Recommended