1.常用的通用功能已經封裝好了,在如zen_API.h 頭文件中,不用費力查看內部細節,浪費時間。(參考:Extending and Embedding PHP 的附錄A) 2.在terminal中運行測試程序,可以看到擴展的內部 " /> 成人a在线观看,黄色网址视频,一级性视频

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP擴展編寫點滴 技巧收集

紅色部分是我的注釋。
更多信息參看:

1.常用的通用功能已經封裝好了,在如zen_API.h 頭文件中,不用費力查看內部細節,浪費時間。(參考:Extending and Embedding php 的附錄A)
2.在terminal中運行測試程序,可以看到擴展的內部錯誤輸出,這一點對于解決內存泄漏問題尤其重要。(編譯一個debug 的 lib)
3.開發過程中修改Makefile中的“CFLAGS = -g -O2”,去掉優化選項,增加-Wall和-pedantic,便于調試和顯示編譯警告;
4.某zval*,但其strval非拷貝的,不可用zval_ptr_dtor(zval**),要用efree(void*)。
5.terminal中的$_SERVER['PWD']有值,但是無法通過zend_getenv()取得,原因應該是該值無意義或不可靠。
6.調用“導出函數”,可利用INTERNAL_FUNCTION_PARAM_PASSTHRU傳參;聲明的非導出函數可通過INTERNAL_FUNCTION_PARAM使用“導出函數”的參數。
7.注意:RETURN_TYPE用在選擇分之和循環等處時,最好置于花括號中,
或者不用分號,因為:#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }。
8.如果函數的參數是引用的,且非標量,要先析構,以防內存泄露。
9.拋出異常前最好判斷EG(exception)中是否已經存在異常,否則會造成內存泄露。
10.當Web服務器API是ISAPI (IIS)的時候,zend_getenv函數是不起作用的。
11.向zend_stack_push()傳入數據指針,實際存儲(copy)的是該指針指向的數據,換句話說,傳入的應該是要存儲的數據的指針。
ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size);
ZEND_API int zend_stack_top(zend_stack *stack, void **element);
其中,size == sizeof(*element);
類似地,zend_hash也是如此,比較zend_hash_update和zend_hash_find。
12.使用add_assoc_zval(HashTable*, const char*, zval*)存儲的是zval*,而非zval,因此,
存儲用戶傳入的參數時候,要先拷貝一份新的zval,否則會發生不可預料的事情。
13.zval_dtor(zval*)釋放變量及其內部的引用內存,zval_ptr_dtor(zval**)先檢查refcount
再決定是否調用zval_dtor(zval*),zval_copy_dtor(zval*)僅執行深層的拷貝,即只拷貝
起內部引用的內存,而不拷貝zval;

14.如使用VC編譯win的動態鏈接庫,而且代碼中調用了zend函數,如zend_getenv,在zend.h中定義為:



extern "C" {
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
}
需要引入該函數,如要使用ZEND_API,需要事先取消LIBZEND_EXPORTS(包括VC“設置”中的預處理定義),或者使用ZEND_DLIMPORT,
ZEND_DLIMPORT char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
下面取自:zend_config.w32.h
復制代碼 代碼如下:
#ifdef LIBZEND_EXPORTS
# define ZEND_API __declspec(dllexport)
#else
# define ZEND_API __declspec(dllimport)
#endif
#define ZEND_DLEXPORT __declspec(dllexport)
#define ZEND_DLIMPORT __declspec(dllimport)

executor_globals_id也需要作如下聲明:
ZEND_DLIMPORT int executor_globals_id;
(這個比較有用,如果你要手工編譯某些擴展的時候,比如我在編譯sqlite3這個擴展的時候,就遇到這個問題。)

php技術PHP擴展編寫點滴 技巧收集,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 最新欧美精品一区二区三区不卡 | 国产精品自在线观看剧情 | 色婷婷久久综合中文久久一本` | 亚洲欧美另类国产综合 | 另类亚洲图片 | 欧美黑人两根巨大挤入 | 成年ssswww网站 | 人人干人人看 | 日本精品久久久久久久久免费 | www.色网站| 一区二区三区在线观看免费 | 精品国产污网站在线观看15 | 久热99这里只有精品视频6 | 最新eeuss影院在线观看 | 欧美激情a∨在线视频播放 欧美激情不卡 | 好吊妞视频这里只有精品 | 亚洲精品视频二区 | 午夜国产福利 | 91蜜桃传媒一二三区 | 国产第一页视频 | 黄色影片在线免费观看 | 超级色的网站观看在线 | 国产成人午夜极速观看 | 亚洲一区在线观看视频 | 国产在线一区视频 | 加勒比色久综合在线 | 在线观看国产情趣免费视频 | 婷婷影音 | 国产精品永久免费自在线观看 | 国产极品在线观看 | 精品久久久久久亚洲精品 | 青青草色久综合网 | 精品中文字幕乱码一区二区 | 日本精品高清一区二区2021 | 日本精品视频一区 | 六月婷婷激情 | 91成人在线观看 | 91大夯在线观看手机观看 | 国产一区二区三区高清视频 | 国语对白91| 亚洲成人在线免费观看 |