星期三, 5月 25, 2016
星期二, 5月 24, 2016
[PHP] php-extension: 範例練習
經過前幾次的練習與說明,筆記一下因為自已的需求測試的範例
範例: 從自已建一個額外的C語言的檔案呼叫
1.修正一下config.m4指定載入額外的C語言
dnl config.m4 for extension
PHP_ARG_ENABLE(foo, whether to enable foo extension support,
[--enable-foo Enable foo extension support])
dnl 檢測extension是否已被啟動
if test $PHP_FOO != "no"; then
AC_MSG_CHECKING("start to enable extension");
dnl PHP_NEW_EXTENSION(foo, php_foo.c, $ext_shared)
dnl 注意多引用了自定義C語言func
PHP_NEW_EXTENSION(foo, php_foo.c hello_world_c.c, $ext_shared)
fi
2.先建立自已的C的實作與標頭檔
hello_world_c.h, hello_world_c.c
int hello_world_c_add(int, int);
/*Hello World program*/
#include <stdio.h>
#include "hello_world_c.h"
int hello_world_c_add(int a,int b){
int sum = 0;
printf("hello_world_c_add is coming Orz\n");
printf("%d\n", a);
printf("%d\n", b);
sum = a+b;
printf("sum=%d\n", sum);
return sum;
}
int main(){
printf("Hello World C :D");
printf("sum=%d",hello_world_c_add(10,10));
return 0;
}
3. 在php_foo.c裡面include hello_world_c.h檔
#include "hello_world_c.h"//內部的c func
#include "php_foo.h"
#if COMPILE_DL_FOO
ZEND_GET_MODULE(foo)
#endif
....
3. 新增一個PHP_FUNCTION: 呼叫剛剛的hello_world_c_add
//呼叫自定義的c函數,來處理加法
PHP_FUNCTION(foo_hello_add) {
php_printf("run foo_hello_add\n");
int val1;
int val2;
int sum;
//parse parameters
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &val1,&val2 ) == FAILURE) {
RETURN_FALSE;
}
php_printf("val1=%d\n",val1);
php_printf("val2=%d\n",val2);
sum = hello_world_c_add(val1,val2);
RETURN_DOUBLE(sum);
}
範例: C實作/標頭檔搬到子資料夾
接著想把不同自定義的C函式庫分裝到不同的sub-folder後就爆了以下訊息:
目前這個範例卡關中...
範例: 全域變數的操作
範例: 回傳resouce
參考
- https://github.com/jheth/hello-php-extension
- 在 PHP Extension 中加入 static 和 dynamic library
- Linux静态链接库与动态链接库的区别及动态库的创建
- Linux中创建静态库和动态库
- http://php.net/manual/en/internals2.structure.globals.php
- https://github.com/walu/phpbook/blob/master/12.5.md
星期一, 5月 23, 2016
[PHP] php-extension編譯C++
如有c++函式庫需要處理,請在config.m4加入以下指令:
PHP_REQUIRE_CXX()
PHP_SUBST(YOUREXTENSION_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(stdc++, "", YOUREXTENSION_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++,EXTRA_LDFLAGS)
dnl 上面設定好了,PHP_NEW_EXTENSION的第二個參數就可以輸入 c++的檔案了,下面的例子還是C
PHP_NEW_EXTENSION(foo, php_foo.c, $ext_shared)
[PHP] config.m4 指令集筆記
記錄一下一定會忘記的php-ext常用的指令說明。
指令集
- AC_MSG_CHECKING
畫面輸出訊息
checking whether to enable foo extension support
PHP_SUBST(XXXX_SHARED_LIBADD), 其中 XXXX 為 PHP Extension 的名稱 (全大寫)
完整指令
XXXX: 你想要載入的extension name
PHP_ADD_LIBRARY_WITH_PATH([library name], [library path], XXXX_SHARED_LIBADD)
例如我們想加入 libabc.so, 而該檔案在 /usr/lib, 則我們會加入: PHP_ADD_LIBRARY_WITH_PATH(abc, /usr/lib, XXXX_SHARED_LIBADD)
範例 PHP_NEW_EXTENSION(foo, foo.c bar.c baz.cpp, $ext_shared)
參考
http://tglcowcow.blogspot.tw/2008/05/php-extension-static-dynamic-library.html
- PHP_SUBST
PHP_SUBST(XXXX_SHARED_LIBADD), 其中 XXXX 為 PHP Extension 的名稱 (全大寫)
- PHP_ADD_LIBRARY_WITH_PATH
- PHP_CHECK_LIBRARY
- PHP_ADD_INCLUDE
- PHP_ADD_BUILD_DIR
- PHP_ADD_LIBRARY_WITH_PATH
完整指令
XXXX: 你想要載入的extension name
PHP_ADD_LIBRARY_WITH_PATH([library name], [library path], XXXX_SHARED_LIBADD)
例如我們想加入 libabc.so, 而該檔案在 /usr/lib, 則我們會加入: PHP_ADD_LIBRARY_WITH_PATH(abc, /usr/lib, XXXX_SHARED_LIBADD)
- PHP_NEW_EXTENSION
範例 PHP_NEW_EXTENSION(foo, foo.c bar.c baz.cpp, $ext_shared)
參考
http://tglcowcow.blogspot.tw/2008/05/php-extension-static-dynamic-library.html
星期一, 5月 16, 2016
[PHP] php extension 初試: extension parser parameter (接收參數)
接續先前的基本範例,接著要來練習怎麼接收帶入extension的參數:
zend_parse_parameters方法
zend_parse_parameters提供不同的接收變數的方式,
變數1: ZEND_NUM_ARGS() TSRMLS_CC, 二個值中間是空白,ZEND_NUM_ARGS表示傳入參數的個數
變數2: 傳入變數的格式化字串
星期五, 5月 13, 2016
[PHP] php extension 初試
拜讀完php-extension骨架練習,
如果C語言忘得差不多錄影檔有從基本的C語言開始教起:D
Note:
如果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
星期四, 5月 12, 2016
[PHP] php 呼叫 C library一些方法
最近工作轉換跑道寫php,然後還要用php呼叫同事寫的c library,找了一些相關的筆記:
1. 寫php extension
中文相關
學習資源
1. 寫php extension- http://php.net/manual/en/internals2.ze1.zendapi.php
- http://www.phpinternalsbook.com/
- PHP Extensions Made Eldrich: Installing PHP
- PHP Extensions – How and Why?
- https://programm.froscon.de/2012/system/attachments/182/original/main.pdf
中文相關
- 手動編譯
安裝PHP Extension、 Linux( ) - 如何寫 PHP Extension
- PHP Extension & Makefile 製作
- 撰寫自己的 PHP extensions - 1 hello world
- [PHP] PHP 也有 Day #21 - c9s 主講:從 C 語言到 PHP Extension 學習筆記
- PHP 也有 Day #21 - 從 C 語言到 PHP Extension by 林佑安
c9s)( - 寫一個Hello World的PHP Extension
訂閱:
意見 (Atom)




