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

1. 关于扩展的教程貌似挺全了,为啥还写?

  1. 记录下我写扩展的历程

  2. 自认为会写的更容易理解

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

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

  1. C 为啥放第一位?

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

  3. PHP的编译安装

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

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

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

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

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

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

代码说明

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

  2. 扩展名称 laosiji

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

  4. 三个文件

  5. config.m4

  6. php_laosiji.h

  7. laosiji.c

config.m4

PHP_ARG_ENABLE(laosiji, whether to enable laosiji support,[  --enable-laosiji           Enable laosiji support]
)if test "$PHP_LAOSIJI" != "no"; thenPHP_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 >= 20010901STANDARD_MODULE_HEADER,
#endifPHP_LAOSIJI_EXTNAME, /* 扩展名称 */NULL,                /* Functions */NULL,                /* MINIT */NULL,                /* MSHUTDOWN */NULL,                /* RINIT */NULL,                /* RSHUTDOWN */NULL,                /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901PHP_LAOSIJI_VERSION, /* 扩展版本 */
#endifSTANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_LAOSIJI
ZEND_GET_MODULE(laosiji)
#endif

5. 作为司机的一本基本开车动作 (扩展的编译安装等)

  1. phpize

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

  3. make

  4. make install

  5. 加载 .so 扩展文件

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

<?php
var_dump(extension_loaded('laosiji'));// 自己去了解下 dl 函数
// @ 只是为了不出现那烦人的 提示
// 为了避免不必要的麻烦 建议在 php.ini 加载 扩展
@dl('laosiji.so');var_dump(extension_loaded('laosiji'));

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"; thendnl 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 >= 20010901STANDARD_MODULE_HEADER,
#endifPHP_LAOSIJI_EXTNAME, /* 扩展名称 */NULL,                /* Functions */NULL,                /* MINIT */NULL,                /* MSHUTDOWN */NULL,                /* RINIT */NULL,                /* RSHUTDOWN */NULL,                /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901PHP_LAOSIJI_VERSION, /* 扩展版本 */
#endifSTANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_LAOSIJI
ZEND_GET_MODULE(laosiji)
#endif

参考

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

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

  1. python ai 教学_【Python AI教学】从零开始学Python AI开发系列01

    原标题:[Python AI教学]从零开始学Python AI开发系列01 欢迎开启新的旅程. 从2016年开始,AI人工智能的热潮扑面而来.而在机器学习和深度学习领域,Python位于最受欢迎的编程 ...

  2. php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数

    上一篇扩展开发引导文章中.创建了编写扩展的三个基本文件.或许你会有个疑问 PHP没有类似的自动生成项目框架的工具吗? 当然有. 这篇文章就开始介绍使用 "php-ext-cli" ...

  3. Chrome浏览器扩展开发系列之一:初识Google Chrome扩展

    1.       Google Chrome扩展简介 Google Chrome扩展是一种软件,以增强Chrome浏览器的功能. Google Chrome扩展使用HTML.JavaScript.CS ...

  4. 浏览器扩展开发系列教程(一)

    以谷歌内核的浏览器扩展,包括 edge chrome ,还有我们常用的国产浏览器都能使用 浏览器扩展是一种软件,以增强Chrome内核浏览器的功能.浏览器扩展使用HTML.JavaScript.CSS ...

  5. php扩展开发中文教程.pdf,PHP扩展开发系列教程-1

    PHP的核心由两部分组成.最底层是zend引擎(ZE).另一部分是PHP内核,她绑定了SAPI层(Server Application Programming Interface). ###扩展的内存 ...

  6. Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展

    Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...

  7. 【php内核与扩展开发系列】PHP生命周期---启动、终止与模式

    启动与终止 PHP程序的启动可以看做有两个概念上的启动,终止也有两个概念上的终止.其中一个是PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止,这次启动PHP会初始化一些必要数据,比如 ...

  8. 佳明手表APP开发系列01——简单汉化英文版

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.佳明手表APP开发过程简介 二.做个简单的个性化--在英文版写几个汉字 1.MonkeyC 图形处理 2.获得汉字 ...

  9. php将123456分割,PHP扩展开发系列教程3-接收用户参数

    与用户空间的代码不同,内部函数的参数实际上并不是在函数头部声明的,而是将参数列表的地址传入每个函数---不论是否传入了参数---而且,函数可以让Zend 引擎将它们转化为便于使用的东西. ###通过定 ...

最新文章

  1. div自己移除自己/移除div下面的所有子元素
  2. 如何自学python基础-零基础如何学习python
  3. Django入门项目实践(中)
  4. 【Python】推荐10个好用到爆的Jupyter Notebook插件,让你效率飞起
  5. js/vue 高德地图绘制驾车路线图
  6. php的异常详解,php5异常处理详解_php
  7. skype 回放设备出现问题
  8. 工作178:moment使用
  9. 学生成绩统计c语言课程设计,学生成绩管理系统-C语言课程设计
  10. scala学习-Linux命令行运行jar包传入main方法参数
  11. 一次tns连接错误的解决过程
  12. [精品]CAD批量处理工具
  13. leetcode-739.每日温度-单调栈
  14. APP性能测试——内存测试
  15. 前端框架vue3的node安装及项目构建的4种方法
  16. 对RecyclerView Item做动画
  17. 119 李元翼 梧里 徒死無益
  18. el-element使用本地自定义图标
  19. PDF 预览和下载你是怎么实现的?
  20. APP逆向案例之(三)sign 参数破解

热门文章

  1. linux系统开启端口转发,linux如何使用iptables进行本地端口转发
  2. import cycle not allowed_Cycle药物介绍醋酸群勃龙(2)
  3. 页面打印错误 抛出异常 公司内部用
  4. java 基本变量类型_Java自学-基本变量类型
  5. python snap7 plc db_python snap7讀寫s7-1200PLC的數據(PLC的I、Q、M區)
  6. html游戏键盘控制,键盘控制方块移动.html
  7. 2021年春季学期-信号与系统-第二次作业参考答案-第五小题
  8. 学生科技周的讲座-2021-内容准备
  9. 初学者的深度学习训练与部署
  10. java反编译工具jadclipse_java反编译工具jad及jadclipse