A. 如何用c語言在windows平台上開發php extension
如何使用C語言開發PHP擴展。
函數功能:php裡面的整數是有符號數,其內部實現其實就是long,不是unsigned long。對於32位機器來說,php最大能表示的整數就是2^31-1了,一般在應用中碰到大於2^31-1而小於2^32的數就只能用字元串來表示了。對於mixed int_ext(string in)來說,如果字元串in表示的整數小於2^31-1,那麼就返回整數,如果大於就返回字元串。
開發擴展步驟如下:(首先需要下載php的源碼,這里下載的是php-5.3.14)
1,建立擴展骨架
[plain] view plainprint?
01.cd php-5.3.14/ext
02../ext_skel --extname=int_ext
cd php-5.3.14/ext
./ext_skel --extname=int_ext
2,修改編譯參數
[plain] view plainprint?
01.cd php-5.3.14/ext/int_ext
02.vi config.m4
cd php-5.3.14/ext/int_ext
vi config.m4去掉 PHP_ARG_ENABLE(int_ext, whether to enable int_ext support 和
[ --enable-int_ext Enable int_ext support]) 兩行前面的dnl 修改後為:
[plain] view plainprint?
01.1. dnl Otherwise use enable:
02.2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,
03.3. dnl Make sure that the comment is aligned:
04.4. [ --enable-int_ext Enable int_ext support])
1. dnl Otherwise use enable:
2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,
3. dnl Make sure that the comment is aligned:
4. [ --enable-int_ext Enable int_ext support])
3,編寫C代碼
[plain] view plainprint?
01.cd php-5.3.14/ext/int_ext
02.vi php_int_ext.h
03.#在 PHP_FUNCTION(confirm_int_ext_compiled); 後面新增一行 PHP_FUNCTION(int_ext);
cd php-5.3.14/ext/int_ext
vi php_int_ext.h
#在 PHP_FUNCTION(confirm_int_ext_compiled); 後面新增一行 PHP_FUNCTION(int_ext);[plain] view plainprint?
01.cd php-5.3.14/ext/int_ext
02.vi int_ext.c
03.#在PHP_FE(confirm_int_ext_compiled, NULL) 後面添加 PHP_FE(int_ext, NULL)添加後為:
04.1. zend_function_entry int_ext_functions[] = {
05.2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */
06.3. PHP_FE(int_ext, NULL) /* For testing, remove later. */
07.4. {NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */
08.5. };
cd php-5.3.14/ext/int_ext
vi int_ext.c
#在PHP_FE(confirm_int_ext_compiled, NULL) 後面添加 PHP_FE(int_ext, NULL)添加後為:
1. zend_function_entry int_ext_functions[] = {
2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */
3. PHP_FE(int_ext, NULL) /* For testing, remove later. */
4. {NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */
5. };
核心代碼:
[plain] view plainprint?
01.PHP_FUNCTION(int_ext)
02.{
03. char * str = NULL;
04. int str_len;
05. int argc = ZEND_NUM_ARGS();
06. if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)
07. return ;
08. char * result;
09. int result_length = str_len;
10. result = (char *) emalloc(result_length + 1);
11. memcpy(result,str,result_length);
12. unsigned long result_num = strtoul(result, NULL, 10);
13. int sizeoflong sizeof(long);
14. unsigned long max_long = 1 << (sizeoflong * 8 -1);
15. if(result_num < max_long)
16. {
17. RETURN_LONG(result_num);
18. }
19. else
20. {
21. RESULT_STRINGL(result, result_length, 0);
22. }
23.}
PHP_FUNCTION(int_ext)
{
char * str = NULL;
int str_len;
int argc = ZEND_NUM_ARGS();
if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)
return ;
char * result;
int result_length = str_len;
result = (char *) emalloc(result_length + 1);
memcpy(result,str,result_length);
unsigned long result_num = strtoul(result, NULL, 10);
int sizeoflong sizeof(long);
unsigned long max_long = 1 << (sizeoflong * 8 -1);
if(result_num < max_long)
{
RETURN_LONG(result_num);
}
else
{
RESULT_STRINGL(result, result_length, 0);
}
}
4,編譯
[plain] view plainprint?
01.cd php-5.3.14/ext/int_ext
02./usr/local/php/bin/pphpize
03../configure --with-php-config=/usr/local/php/bin/php-config
04.make
05.make install
cd php-5.3.14/ext/int_ext
/usr/local/php/bin/pphpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
此時會產生一個so文件: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/int_ext.so
修改php.ini 添加擴展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
[int_ext]
extension = int_ext.so
5,測試
[plain] view plainprint?
01.$a = int_ext("12345678900");
02.var_mp($a);
03.$a = int_ext("123456789");
04.var_mp($a);
$a = int_ext("12345678900");
var_mp($a);
$a = int_ext("123456789");
var_mp($a);
結果輸出:
[plain] view plainprint?
01.string(11) "12345678900"
02.int(123456789)
B. 怎樣用c來編寫php的擴展
在php.net下載php源碼(The Complete Source Code),後綴是.tar,可以使用RAR解壓,解壓之後,使用Visual Studio 2005新建一個Win32應用程序,接下來選擇DLL工程,之後需要設置VC編譯器的INCLUDE目錄,在.tar解壓目錄,包括以下目錄X:/PHP5Src/main,X:/PHP5Src/Zend,X:/PHP5Src/TSRM,X:/PHP5Src/regex,X:/PHP5Src添加了INCLUDE目錄後,設置預處理命令,ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32再添加連接器的Library,此目錄為已安裝的php目錄下的DEV下。接下來編輯源程序,替換stdafx.h的內容為:#pragma once
/* PHP Extension headers */
/* include zend win32 config first */
#include "zend_config.w32.h"
/* include standard header */
#include "php.h"替換工程默認的cpp內容為#include "stdafx.h"/* declaration of functions to be exported */
ZEND_FUNCTION(DoubleUp);
/* compiled function list so Zend knows what's in this mole */
zend_function_entry CustomExtMole_functions[] = {
ZEND_FE(DoubleUp, NULL)
{NULL, NULL, NULL}
};
/* compiled mole information */
zend_mole_entry CustomExtMole_mole_entry = {
STANDARD_MODULE_HEADER,
"CustomExt Mole",
CustomExtMole_functions,
NULL, NULL, NULL, NULL, NULL,
NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
/* implement standard "stub" routine to introce ourselves to Zend */
ZEND_GET_MODULE(CustomExtMole)
/* DoubleUp function */
/* This method takes 1 parameter, a long value, returns
the value multiplied by 2 */
ZEND_FUNCTION(DoubleUp){
long theValue = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"l", &theValue) == FAILURE){
RETURN_STRING("Bad parameters!", true);
}
theValue *= 2;
RETURN_LONG(theValue);
}然後編譯成DLL文件,相信需要參考php手冊,裡面講的很詳細
C. 關於用C語言寫的mysql訪問程序,作成PHP擴展的問題。
編譯時配置好依賴關系吧,然後如果PHP環境比較多,別弄錯環境就好了。
D. nginx 下用c寫了一個php的擴展 但是出現了502錯誤
不是反不返回的問題,段錯誤是指你使用了非法的內存,一定是你 a() 函數里內存使用有問題,所以調用這個函數才會出錯,沒有代碼就無法解答了。C語言最常見的就是段錯誤了
E. 如何利用C自定義實現PHP擴展
注意兩點即可:
第一,調用其它文件的函數或類,需要先用include,require,include_once,require_once這些函數包含一下其它文件,這四個函數的區別,你可以查一下手冊。
第二,對於類外面的函數,在文件包含以後,可以直接調用;對於類內部的函數,在文件包含以後,如果是靜態函數,就用 類名::函數名 進行調用,如果不是靜態函數,就需要先將類實例化,然後用 實例化的對象->函數名 進行調用。
F. php中怎麼將c語言代碼編譯為php可用擴展
還是得使用C語言的編譯器,,,,,按PHP的擴展規范去寫、編譯、鏈接
~
G. C擴展PHP 是什麼意思,能舉個簡單的例子嗎
斷點就是在調試的時候中斷一下,比如
#include<stido.h>
intmain(void)
{
printf("hello.\n");
printf("helloworld.\n");
return0;
}
如果這個程序在第一個printf語句後設置斷點就只輸出hello,如果在第二個printf語句後設置斷點,則兩個printf後的語句都輸出。明白了嗎?
H. 用C語言寫PHP擴展如題 謝謝了
1.一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13 #> cd /software/php-5.2.13/ext 二、假設我們要開發一個名為caleng_mole的擴展,該擴展包含兩個函數:a--處理兩個整型相加和b-處理字元串重復輸出; 1、首先編寫一個函數定義文件,該文件編寫函數原型後綴為def,假設為:caleng_mole.def int a(int x, int y) string b(string str, int n) 2、通過擴展骨架生成器,將在ext目錄下自動建立擴展目錄caleng_mole #> ./ext_skel --extname=caleng_mole --proto=caleng_mole.def 3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_mole/config.m4,將如下行的注釋標簽"dnl"去掉,修改後如下所示: PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, Make sure that the comment is aligned: [ --enable-myfunctions Enable myfunctions support]) 4、完善函數a和b的功能: #> vim /software/php-5.2.13/ext/caleng_mole/caleng_mole.c PHP_FUNCTION(a) { int x, y, z; int argc = ZEND_NUM_ARGS(); if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE) return; z = x + y; RETURN_LONG(z); } PHP_FUNCTION(b) { char *str = NULL; int argc = ZEND_NUM_ARGS(); int str_len; long n; char *result; char *ptr; int result_length; if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE) return; result_length = str_len * n; result = (char *) emalloc(result_length + 1); ptr = result; while (n--) { memcpy(ptr, str, str_len); ptr += str_len; } *ptr = '\0'; RETURN_STRINGL(result, result_length, 0); } 三、編譯安裝,假設php的安裝目錄為:/usr/localhost/webserver/php #> cd /software/php-5.2.13/ext/caleng_mole #> /usr/localhost/webserver/php/bin/phpize #> ./configure --with-php-config=/usr/localhost/webserver/php/bin/php-config #> make #> make install 現在將在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目錄下生成caleng_mole.so文件 在php.ini配置文件中加入: extension=caleng_mole.so. 搞定收工
I. 如何編寫一個PHP的C擴展
一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13
一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13
#> cd /software/php-5.2.13/ext
二、假設我們要開發一個名為caleng_mole的擴展,該擴展包含兩個函數:a--處理兩個整型相加和b-處理字元串重復輸出;
1、首先編寫一個函數定義文件,該文件編寫函數原型後綴為def,假設為:caleng_mole.def
int a(int x, int y)
string b(string str, int n)
2、通過擴展骨架生成器,將在ext目錄下自動建立擴展目錄caleng_mole
#> ./ext_skel --extname=caleng_mole --proto=caleng_mole.def
3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_mole/config.m4,將如下行的注釋標簽"dnl"去掉,修改後如下所示:
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,
Make sure that the comment is aligned:
[ --enable-myfunctions Enable myfunctions support])
4、完善函數a和b的功能: #> vim /software/php-5.2.13/ext/caleng_mole/caleng_mole.c
PHP_FUNCTION(a)
{
int x, y, z;
int argc = ZEND_NUM_ARGS();
if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)
return;
z = x + y;
RETURN_LONG(z);
}
PHP_FUNCTION(b)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;
long n;
char *result;
char *ptr;
int result_length;
if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
return;
result_length = str_len * n;
result = (char *) emalloc(result_length + 1);
ptr = result;
while (n--) {
memcpy(ptr, str, str_len);
ptr += str_len;
}
*ptr = '\0';
RETURN_STRINGL(result, result_length, 0);
}
三、編譯安裝,假設php的安裝目錄為:/usr/localhost/webserver/php
#> cd /software/php-5.2.13/ext/caleng_mole
#> /usr/localhost/webserver/php/bin/phpize
#> ./configure --with-php-config=/usr/localhost/webserver/php/bin/php-config
#> make
#> make install
現在將在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目錄下生成caleng_mole.so文件
在php.ini配置文件中加入: extension=caleng_mole.so.
搞定收工
J. 編寫PHP擴展必須要學習C語言嗎
php整個底層都是用c語言寫的,擴展庫的開發,必須具備c語言的知識。