当前位置:首页 » 编程语言 » cphp扩展

cphp扩展

发布时间: 2022-05-02 11:29:02

‘壹’ 如何用c语言编写php扩展的详解

1:预定义
在home目录,也可以其他任意目录,写一个文件,例如caleng_mole.def
内容是你希望定义的函数名以及参数:
int a(int x,int y)
string b(string str,int n)

2:到php源码目录的ext目录
#cd /usr/local/php-5.4.0/ext/

执行命令,生成对应扩展目录
#./ext_skel --extname=caleng_mole --proto=/home/hm/caleng_mole.def

3:修改config.m4
去掉dnl的注释

PHP_ARG_ENABLE(caleng_mole, whether to enable caleng_mole support,
Make sure that the comment is aligned:
[ --enable-caleng_mole Enable caleng_mole support])

4:修改caleng_mole.c

代码如下:


/* {{{ proto int a(int x, int y)
*/
PHP_FUNCTION(a)
{
int argc = ZEND_NUM_ARGS();
int x;
int y;
int z;
if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)

return;
z=x+y;
RETURN_LONG(z);
}
/* }}} */
/* {{{ proto string b(string str, int n)
*/
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 = '';
RETURN_STRINGL(result, result_length, 0);
}
/* }}} */


5:生成扩展库
#cd ./caleng_mole
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config
#make
#make install



6:到php的对应extensions目录
如上图所示
#cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
改目录下有生成的caleng_mole.so文件

7:修改php.ini
php.ini如果找不到可以从phpinfo()打出的信息看到
#cd /usr/local/php/lib/
php.ini增加扩展信息
extension=caleng_mole.so

8:重启Apache
# /usr/local/apache2/bin/apachectl restart

9:检查加载
/usr/local/php/bin/php -m

10:PHP调用

代码如下:


echo a(1,2);


输出 3 就说明成功了!

下面是原文
linux下用C开发PHP扩展
一、首先下载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 = '';
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.

‘贰’ 怎样用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手册,里面讲的很详细

‘叁’ php-cpp 开发的扩展如何发布

详情如下:
PHP-CPP是一个用于开发PHP扩展的C++库。PHP-CPP提供了一系列完善的文档、易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展。
用C++编写的算法看起来几乎与用PHP编写的算法相同。如果你知道如何用PHP编程,你可以很容易地学习如何在C++中做同样的事情。实际上,PHP和大多数PHP函数名的语法都直接来自C和C++语法。

‘肆’ 如何用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)

‘伍’ php怎么调用c扩展

在PHP.INI加载编写的扩展,然后直接当系统函数一样使用扩展里面的函数,调用是很简单的。

‘陆’ C扩展PHP 是什么意思,能举个简单的例子吗

比如在win下的lamp环境吧,你想要php支持某个扩展不是需要把php.ini文件的那个注释取消么,那个扩展是个文件类型为.dll的linux下为.soC语言能编译成这两种文件类型.或者说所有的扩展都是C编写的.

‘柒’ 如何利用C自定义实现PHP扩展

注意两点即可:
第一,调用其它文件的函数或类,需要先用include,require,include_once,require_once这些函数包含一下其它文件,这四个函数的区别,你可以查一下手册。
第二,对于类外面的函数,在文件包含以后,可以直接调用;对于类内部的函数,在文件包含以后,如果是静态函数,就用 类名::函数名 进行调用,如果不是静态函数,就需要先将类实例化,然后用 实例化的对象->函数名 进行调用。

‘捌’ C扩展PHP 是否可以达到加密代码的目的

显然可以,你用c扩展了你的功能,别人拿走你的代码,没有扩展,自然玩不转。。这是最可靠的加密方法,虽然不是密文加密码,但比密文可靠。。

‘玖’ 如何编写一个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.
搞定收工

‘拾’ 用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. 搞定收工

热点内容
疫情期间访问国外网络 发布:2025-05-15 02:24:24 浏览:246
我的世界网易版游戏服务器 发布:2025-05-15 02:23:46 浏览:221
全球编程网站 发布:2025-05-15 02:22:55 浏览:333
编程猫知乎 发布:2025-05-15 02:18:00 浏览:631
服务器转接搭建 发布:2025-05-15 02:12:50 浏览:518
编译好的内核如何升级另一台主机 发布:2025-05-15 02:00:06 浏览:759
弹反脚本 发布:2025-05-15 01:58:24 浏览:587
安卓按键大师怎么用 发布:2025-05-15 01:54:12 浏览:688
手机ea服务器连不上怎么办 发布:2025-05-15 01:35:03 浏览:451
数据库数据插入语句 发布:2025-05-15 01:30:01 浏览:872