星期五, 5月 13, 2016

[PHP] php extension 初試

拜讀完php-extension骨架練習,
如果C語言忘得差不多錄影檔有從基本的C語言開始教起:D


如果C語言已經很熟的話,可以跳至26:38秒開始

測試環境

  1. MacOSX EI
  2. 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(來判斷變數是否還有被使用)。

Null-Terminated String



初始化 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===================

主要檔案架構

git clone https://github.com/iambigd/php-ext-skeleton.git


由於c9s大大提供簡易的骨架,對於第一次要寫extension的新手真是大大幫助
這個骨架只要包含以下三個檔案

  • config.m4 讓phpize這個指令工具產生編譯環境 (makefile 一堆東西)
  • php_foo.c 主要寫c code的地方
  • php_foo.h  要給php用的function要宣告在這裡


編譯過程 




$>phpize



如果出現以上錯誤,請使用brew install autoconf,,再重跑phpize即可 (在mac上遇到這個錯誤)

 跑成功就會有一些makefile檔案被產生了

  
$>./configure --enable-foo
這裡的--enable-foo 紅色的foo指的是config.m4裡面的foo


$>make 

編輯完會在php-ext-skeleton/modules目錄下

$>make install (安裝)


----------------------------------------------------------------------
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檔,新增你的extension=foo.so,並重新啟動apache。

以下指令可以查php.ini的位置

php -i | grep "Loaded Configuration File"

簡單測試

php -r "echo foo_hello();";

撰寫測試

新增一個測試資料夾

mkdir tests

新增測試單元
vim /tests/foo.phpt

執行測試
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();
}


沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails