build your own php extension hanoi php day 2010 bui dinh ngoc aiti-aptech - cah trưng đào to lp...
TRANSCRIPT
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