PHP7扩展开发之基于函数方式使用lib库的方法详解


Posted in PHP onJanuary 15, 2018

本文实例讲述了PHP7扩展开发之基于函数方式使用lib库的方法。分享给大家供大家参考,具体如下:

前言

首先说下什么是lib库。lib库就是一个提供特定功能的一个文件。可以把它看成是PHP的一个文件,这个文件提供一些函数方法。只是这个lib库是用c或者c++写的。

使用lib库的场景。一些软件已经提供了lib库,我们就没必要再重复实现一次。如,原先的mysql扩展,就是使用mysql官方的lib库进行的封装。

在本文,我们将建立一个简单的lib库,并在扩展中进行封装调用。

代码

基础代码

这个扩展,我们将在say扩展上增加call_lib_fun()。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

代码实现

建立lib库

增加hello.h文件。代码如下:

#ifndef TEST_HEADER_FILE
#define TEST_HEADER_FILE
#include <stdlib.h>
#include <string.h>
char * show_site(); 
#endif

增加hello.c文件。代码如下:

#include "hello.h"
char * show_site()
{
  char *site = malloc(15 * sizeof(char));
  strcpy(site, "www.bo56.com");
  return site;
}

然后使用以下命令生成lib库(动态库)文件:

$ gcc -g -O0 -fPIC -shared -o hello.so ./hello.c

这样在当前目录下就会生成一个hello.so的动态库文件。不同操作系统动态库的扩展名可能不一样。如 windows下是dll,mac下是 dylib,linux下是so。

然后把hello.so拷贝到/usr/local/lib/目录下,命名为hello.so
hello.h拷贝到/usr/local/include/目录下。

修改config.m4文件

增加扩展对动态库的依赖。主要增加以下几行代码:

PHP_ADD_LIBRARY_WITH_PATH(hello, /usr/local/lib/, SAY_SHARED_LIBADD)
PHP_SUBST(SAY_SHARED_LIBADD)

编写扩展代码

增加hello.h的引用。

#include "php_say.h"
#include <stdio.h>
//下面这行是增加的
#include "hello.h"

增加show_site()方法。代码如下:

PHP_FUNCTION(show_site)
{
  char *site = show_site();
  RETVAL_STRING(site);
  free(site);
  return;
}

php调用结果

<?php
$result = show_site();
var_dump($result);
?>

执行结果

$php ./test.php
string(12) "www.bo56.com"

代码解读

PHP_ADD_LIBRARY_WITH_PATH 是用于指定lib库的名字,地址等信息。第一个参数是名字,第二个参数是地址。

在say.c文件中增加lib库的头文件。使用#include "hello.h"

在扩展代码中就像调用其他内核提供的方法一样,去调用lib库中的方法。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
坏狼的PHP学习教程之第2天
Jun 15 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
php HTML无刷新提交表单
Apr 05 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
PHP实现文件上传下载实例
Oct 18 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 #PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 #PHP
详解PHP序列化和反序列化原理
Jan 15 #PHP
PHP使用两个栈实现队列功能的方法
Jan 15 #PHP
php获取ajax的headers方法与内容实例
Dec 27 #PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 #PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 #PHP
You might like
提问的智慧(2)
2006/10/09 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
JavaScript中的事件处理
2008/01/16 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
2017/09/28 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python Socket之客户端和服务端握手详解
2017/09/18 Python
Django进阶之CSRF的解决
2018/08/01 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
如何利用python 读取配置文件
2021/01/06 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
班长岗位职责
2013/11/10 职场文书
欢迎家长标语
2014/10/08 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
关于军训的感想
2015/08/07 职场文书
如何才能写好调研报告?
2019/07/03 职场文书