资讯专栏INFORMATION COLUMN

PHP扩展开发系列01 - 我要成为一名老司机

30e8336b8229 / 996人阅读

摘要:找找出别人扩展真么写的。这次主要说了下写扩展要准备的一些基本知识。比如不同编译方式这个你看别的扩展源码的时候就会注意到具体作用。后面再来慢慢学习老司机的各种姿势。包括,函数,函数参数,函数返回值,对象,类,命名空间等等等。

PHP扩展开发系列01 - 我要成为一名老司机 1. 关于扩展的教程貌似挺全了,为啥还写?

记录下我写扩展的历程

自认为会写的更容易理解

我的宗旨就是 "先用再识" 代码写着写着就知道原理了 或者说边写边学, 边学边写

2. 那么你首先要具备哪些预备知识? 答:你需要先过科目一

C 为啥放第一位?

PHP 不会?那写什么PHP扩展?

PHP的编译安装

phpize 和 php-config 这个靠你们自己去了解了

关于PHP编译 前期非必须,但是要知道的 (no-debug, non-zts, debug, zts)

问?搜? -- 有时候不一定要问或者搜才能找到解决的答案。

找! --- 找出别人扩展真么写的 (php-src/ext)。不但有答案,还有思想。

至于 PHP ZEND 原理啥的, 很重要, 很重要, 很重要, 但是这里暂时放一边,没事可以去了解了解。

3. 先看看刚上车的司机是什么样的? (示例代码) 最后有注释版的

代码说明

这是一个很简单的扩展, 简单到没有功能

扩展名称 laosiji

目前看来 这只是一个只会装B(啥都不会)的司机

三个文件

config.m4

php_laosiji.h

laosiji.c

config.m4

PHP_ARG_ENABLE(
  laosiji, 
  whether to enable laosiji support,
  [  --enable-laosiji           Enable laosiji support]
)

if test "$PHP_LAOSIJI" != "no"; then
  PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared)
fi

php_laosiji.h

#define PHP_LAOSIJI_EXTNAME "laosiji"
#define PHP_LAOSIJI_VERSION "1.0.0"

// 加载config.h,如果配置了的话
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

// 加载php头文件
#include "php.h"

laosiji.c

#include "php_laosiji.h"

// module entry
zend_module_entry laosiji_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP_LAOSIJI_EXTNAME, /* 扩展名称 */
    NULL,                /* Functions */
    NULL,                /* MINIT */
    NULL,                /* MSHUTDOWN */
    NULL,                /* RINIT */
    NULL,                /* RSHUTDOWN */
    NULL,                /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP_LAOSIJI_VERSION, /* 扩展版本 */
#endif
    STANDARD_MODULE_PROPERTIES};

#ifdef COMPILE_DL_LAOSIJI
ZEND_GET_MODULE(laosiji)
#endif
5. 作为司机的一本基本开车动作 (扩展的编译安装等)

phpize

./configure 这里要注意下 php-config

make

make install

加载 .so 扩展文件

6. 点火启动 试试我们的扩展

7. 小节

差不多就到这里了。这次主要说了下写PHP扩展要准备的一些基本知识。当然有些人可能对上面提到部分概念没深入了解。
比如 PHP不同编译方式(debug, nts..)<这个你看别的扩展源码的时候就会注意到>、phpize、php-config 具体作用。
phpize、php-config 一定要注意,这里提醒你这回遇到坑。

后面再来慢慢学习老司机的各种姿势。包括,函数,函数参数,函数返回值,对象,类,命名空间等等等。

8. 注释版代码

config.m4

dnl dnl 开头的语句 属于注释内容

dnl PHP_ARG_ENABLE 函数有三个参数
dnl 第一个参数 laosiji 扩展名称 (不用加引号)
dnl 第二个参数 运行 ./configure 脚本时显示的内容
dnl 第三个参数 调用 ./configure --help 显示的帮助信息

dnl 最后去了接下 PHP_ARG_WITH 这里就先不提了

PHP_ARG_ENABLE(
  laosiji, 
  whether to enable laosiji support,
  [  --enable-laosiji           Enable laosiji support]
)

if test "$PHP_LAOSIJI" != "no"; then

  dnl PHP_NEW_EXTENSION 函数声明 扩展的名称、需要的源文件名、扩展的编译形式
  dnl 第一个参数 扩展的名称
  dnl 第 2 。。 n-1 个参数  需要的源文件名
  dnl 最后的$ext_shared参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。
  dnl 如果我们的扩展使用了多个文件,便可以将这多个文件名罗列在函数的参数里,如:
  dnl PHP_NEW_EXTENSION(laosiji, laosiji.c, laosiji_2.c, laosiji_3.c, $ext_shared)

  PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared)
fi

php_laosiji.h

// 定义 扩展相关的宏 比如版本号 扩展名称等等。。
#define PHP_LAOSIJI_EXTNAME "laosiji"
#define PHP_LAOSIJI_VERSION "1.0.0"

// 加载config.h,如果配置了的话
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

// 加载php头文件
// 这个 很有必要哈
#include "php.h"

laosiji.c

#include "php_laosiji.h"

// module entry
// 1. laosiji_module_entry  扩展名称_module_entry
// 2. PHP_LAOSIJI_EXTNAME   /* 扩展名称 */
// 3. PHP_LAOSIJI_VERSION, /* 扩展版本 */
// 那些 NULL ? 
// 第一个你要记住 /* Functions */ 这行 想想 php 中的函数
// 第二个你要记住 /* MINIT */ 想想 class && object
// 第三个你要记住 MINIT MSHUTDOWN RINIT RSHUTDOWN MINFO 慢慢来 不着急

zend_module_entry laosiji_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP_LAOSIJI_EXTNAME, /* 扩展名称 */
    NULL,                /* Functions */
    NULL,                /* MINIT */
    NULL,                /* MSHUTDOWN */
    NULL,                /* RINIT */
    NULL,                /* RSHUTDOWN */
    NULL,                /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP_LAOSIJI_VERSION, /* 扩展版本 */
#endif
    STANDARD_MODULE_PROPERTIES};

#ifdef COMPILE_DL_LAOSIJI
ZEND_GET_MODULE(laosiji)
#endif
参考

简单扩展 https://github.com/imlaosiji/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23046.html

相关文章

  • PHP扩展开发系列02 - 司机起步之函数

    摘要:上一篇扩展开发引导文章中。这篇文章就开始介绍使用工具来生成扩展项目文件注意这里的本身没有这玩意,是我给自带的起的别名这个工具就是还有点迷惑那不废话了。至于其他参数自行了解。发现也是有这三个文件的。所以,不要质疑自己。 上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问PHP没有类似的自动生成项目框架的工具吗? 当然有。这篇文章就开始介绍使用 php-ext-cli...

    cloud 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    caspar 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    nihao 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    Drummor 评论0 收藏0
  • 2017年2月份前端资源分享

    平日学习接触过的网站积累,以每月的形式发布。2017年以前看这个网址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二维码 十大经典排序算法(带动图演示) 为什么知乎前端圈普遍认为H5游戏和H5展示的JSer 个人整理和封装的YU.js库|中文详细注释|供新手学习使用 扩展JavaScript语法记录 - 掉坑初期工具 汉字拼音转换...

    chengjianhua 评论0 收藏0

发表评论

0条评论

30e8336b8229

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<