Build your own PHP extension

  • Published on
    18-May-2015

  • View
    2.806

  • Download
    1

Embed Size (px)

Transcript

  • 1. Build your own PHP Extension Hanoi PHP Day 2010 Bui Dinh Ngoc AiTi-Aptech - CAH Trngo to Lp trnh vin Quc t AiTi-Aptech

2. PHP Extension ? 3. PHP Extension

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

4. PHP Extension (Zend Engine)

    • PHP language written inC
    • PHP interpreter written inCtoo
    • And PHP Extension must written inC
    • Another PHP implement may be using diffrence language

5. Why and When need PHP extension ?

    • Buildin PHP function are not enough
    • Existing PHP extension are not enough
    • Pure PHP function are more slow
    • Have C lib can do this for you

6. Prepare

    • Ubuntu Linux
    • GNU C Compiler , build , make utils
    • PHP 5 Dev package : sudo apt-get install php5-dev
    • PHP source code
      • sudo svn checkout http://svn.php.net/viewvc/php/php-src/trunk

7. PHP-Src-5.3 tree directory

8. ext_skel.sh script

9. Write Hello World Extension

  • //Example function call

10.

    • Run ext_skel script : sudo ./ext_skel extname=hello

11. Result

12. phpize

  • Thephpizecommand is used to prepare the build environment for a PHP extension.

13.

14. Edit header file php_hello.h 15. Insert your function to header file

  • PHP_FUNCTION(hello); /*My function here*/

16. Edit C source file - pre declare

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

17. Implement function

  • PHP_FUNCTION(hello) { php_printf(Hello, world!n); }

18. Build - Run some script

    • sudo ./configure
    • sudo make
    • ls modules ->hello.so

19. Test

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

20. Advance !

    • Build php function with parameter
    • Return value
    • Memory allocation
    • Anti Memory leak
    • Array
    • String
    • Global variable
    • PHP.INI variable
    • ........

21. Function with parameter

  • function hello_add ( $a , $b ) { $sum = (int) $a + (float) $b ; return$sum ; }

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

23. Return value

    • bool
    • int
    • double
    • resource
    • array
    • object

Only 6 return type 24. Return value (macro)

  • RETURN_LONG() for integer values
  • RETURN_DOUBLE() for floating point values
  • RETURN_BOOL() for true/false values
  • RETURN_NULL() for null value
  • .....

25. Memory allocation

26. 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

27. Reference

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