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+MySQL的聊天室设计
Oct 09 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
PHP中feof()函数实例测试
Aug 23 PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PDO::inTransaction讲解
Jan 28 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
PHP中散列密码的安全性分析
Jul 26 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
php绘制一个扇形的方法
2015/01/24 PHP
php计算函数执行时间的方法
2015/03/20 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
PHP 类与构造函数解析
2017/02/06 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
用console.table()调试javascript
2014/09/04 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
原生JS实现前端本地文件上传
2018/09/08 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
Python中的localtime()方法使用详解
2015/05/22 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
如何判断计算机可能已经中马
2013/03/22 面试题
英语演讲稿3分钟
2014/04/29 职场文书
环保志愿者活动方案
2014/08/14 职场文书
思想作风建设心得体会
2014/10/22 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
在python中读取和写入CSV文件详情
2022/06/28 Python