如果C語言忘得差不多錄影檔有從基本的C語言開始教起:D
如果C語言已經很熟的話,可以跳至26:38秒開始
測試環境
- MacOSX EI
- MAMP (所以流程中有其他錯誤要處理一下:D)
ZVal是什麼
http://php.net/manual/en/internals2.variables.intro.php
Note:
PHP is a dynamic, loosely typed language, that uses copy-on-write and reference counting.
所有的php變數型態都是定義在一個zval的struct,並且使用copy-on-write(寫入時複製)與reference counting(來判斷變數是否還有被使用)。
初始化 ZVAL
簡化
ZVAL設定值
ZVAL_STRING
ZVAL_LONG
ZVAL_BOOL
垃圾回收機制
可以裝xdebug來看一下你php變數的refcount
REFERENCE COUNTING API
DECREASE REFERENCE COUNTING
zv_ptr是我們跟php vm要的,所以要自已在free
可以簡化成以下這行
zval_ptr_dtor(&zv_ptr);
檢查ZVAL的Type => Z_TYPE_*
Switch 來檢查zval的type
通常的使用方法如下:
=================開始動手寫extension===================
主要檔案架構
由於c9s大大提供簡易的骨架,對於第一次要寫extension的新手真是大大幫助
這個骨架只要包含以下三個檔案
- config.m4 讓phpize這個指令工具產生編譯環境 (makefile 一堆東西)
- php_foo.c 主要寫c code的地方
- php_foo
h 要給php用的function要宣告在這裡.
編譯過程
如果出現以上錯誤,請使用brew install autoconf,,再重跑phpize即可 (在mac上遇到這個錯誤)
跑成功就會有一些makefile檔案被產生了
這裡的--enab
----------------------------------------------------------------------
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20121212/
cp: /usr/lib/php/extensions/no-debug-non-zts-20121212/#INST@10686#: Operation not permitte
d
make: *** [install-modules] Error 1
遇到以上錯誤請關閉Mac SIP請參考這篇
執行後重新開機即可
你可以看到installing shared extensions被安裝的目錄
查看目錄下會多了foo.so的檔案 (so => shared object)
安裝Extension
以下指令可以查php.ini的位置
php -i | grep "Loaded Configuration File"
簡單測試
php -r "echo foo_hello();";
撰寫測試
新增一個測試資料夾
mkdir tests
新增測試單元
執行測試
make test
如何新增extension資訊至phpinfo()
打開php_foo.c修改PHP_MINFO_FUNCTION
//extension說明資料,會出現在 phpinfo
PHP_MINFO_FUNCTION(foo) {
// 產生表格
php_info_print_table_start();
php_info_print_table_header(2,"header1", "header2");
php_info_print_table_row(2, "row col-1", "row col-2");
php_info_print_table_end();
}
沒有留言:
張貼留言
留個話吧:)