加入收藏 | 设为首页 | 会员中心 | 我要投稿 草根网_南昌站长网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

Linux/Ubuntu下C语言开发PHP的.so扩展模块过程[图文]

发布时间:2022-09-28 11:26:32 所属栏目:PHP 来源:
导读:  环境:Linux Ubuntu 2.6.27-7 + PHP Version 5.3.2 + Apache/2.2.9

  如果你用过PHP,那么你已经使用过扩展了。除了少数的几个例外,每一个用户空间的PHP函数都被归类到一个个的扩展中。这其中很大一部分(
  环境:Linux Ubuntu 2.6.27-7 + PHP Version 5.3.2 + Apache/2.2.9
 
  如果你用过PHP,那么你已经使用过扩展了。除了少数的几个例外,每一个用户空间的PHP函数都被归类到一个个的扩展中。这其中很大一部分(总共超过400个)的函数是“标准扩展”的一部分。PHP的源码包附带了大约86个扩展,每一个扩展包含平均30个左右的函数。不难算出,这足有2500个函数。如果这还不够的话,PECL仓库中还提供了超过100个扩展,在因特网上还散布着更多。
 
  “所有的函数都包含在了扩展中php扩展开发教程,那么剩下的还有什么?”你肯定会这么问,”扩展到底用来扩展什么?PHP的核心又是什么?“
 
  PHP的核心由两部分组成。处在最底层的是Zend引擎(ZE)。ZE负责解析人类可读的PHP脚本,生成机器可读的符号,然后在一个进程空间里执行这些符号。ZE还负责内存管理、变量的作用域和执行函数调用。核心的另外一部分是PHP层。PHP绑定到SAPI(Server Application Porgramming Interface, 通常用来指代宿主环境—Apache, IIS, CLI, CGI等)层上,并且负责与它之间的通信。另外,PHP层还为 safe_mode 和 open_basedir 检查提供了一致的控制层,另外还有通过中类似 fopen(), fread() 和 fwrite() 等用户空间函数关联到文件和网络I/O上的流接口。
 
  1> 下载php源码并解压到:/home/roger/soft/php-5.3.2/,并进入ext目录;
 
  2> 在ext目录看到有ext_skel这个可执行程序,ext_skel是创建扩展的shell
 
  3> 使用extname参数指定扩展名称创建一个扩展模块目录:
 
  4> 进入roger目录,这里主要编辑的文件有两个:config.m4和roger.c,config.m4可以配置扩展编译进php的方法,roger.c是编码模块的主要文件。使用vim编辑config.m4文件,找到以下几行:
 
  退出保存(roger.c暂时不做修改);
 
  5> 执行命令phpize,phpize是用来扩展php模块的,完成后可以看到产生了./configure程序:
 
  6> 安装./configure -> make -> make install:
  
  7> 查看生成的roger.so:
 
  8> 修改php.ini加载roger.so,重启apache;
 
  9>查看phpinfo()php扩展开发教程,可以看到roger.so已经加载:
 
  10> 创建一个php文件,

  如果roger.c不做任何修改,会有一个自带的函数confirm_roger_compiled,输出的结果就是上面看到的,下面自定义一个函数。
 
  函数名:roger_test($str)
 
  功能:返回 “your input string:”.$str;
 
  到上面第4步的时候,修改完config.m4,接着修改php_roger.h和roger.c;
 
  找到:PHP_FUNCTION(confirm_roger_compiled); ,新增一行:
 
  PHP_FUNCTION(roger_test);
 
  PHP_FUNCTION(confirm_roger_compiled); /* For testing, remove later. */ PHP_FUNCTION(roger_test); /* For testing, remove later. */
 
  保存退出。
 
  数组里增加我们的函数,找到 const zend_function_entry roger_functions[] ,增加:
 
  PHP_FE(roger_test, NULL)
 
  constzend_function_entryroger_functions[] = { PHP_FE(confirm_roger_compiled, NULL)/* For testing, remove later. */ PHP_FE(roger_test, NULL) /* For testing, remove later. */ {NULL, NULL, NULL}/* Must be the last line in roger_functions[] */ };
 
  保存退出。
 
  再到 roger.c 文件最后面增加如下代码:
 
  PHP_FUNCTION(roger_test) { char *arg = NULL; intarg_len, len; char *strg; if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "s", &arg, &arg_len) == FAILURE){ return; } len = spprintf(&strg, 0, "your input string: %s\n", arg); RETURN_STRINGL(strg, len, 0); }
 

(编辑:草根网_南昌站长网 )

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章