《PHP扩展及核心》

一、主要内容:

1️⃣php扩展的概念和底层实现

2️⃣编写一个php扩展的步骤

3️⃣php底层,Zend 引擎API的介绍 ,HashTable 原理

二、相关概念

1.【php扩展】

php的插件,也就是php的扩展,因为php的底层就是C语言。

php –m 或者 php –i 都可以查看扩展。

其实,xhproh, curl都是php的扩展。

php的扩展图phpinfo()

2.【为什么要有扩展?】

1)【效率高】复杂的图像算法,需要写成PHP扩展

2)【操作底层,未支持的技术】1)PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。 2)有些系统调用不能用PHP直接访问,需要编写成扩展,比如使用Linux下的fork()函数创建一个进程。

3)【商业化,保护源码】想商业话一个应用,但是又不想暴露源代码,就可以编写成扩展。

3.【PHP核心组成?】

Zend引擎:1)核心、基础设施 2)PHP语法实现 3)脚本编译执行 4)扩展机制 5)内存管理

SAPI:服务器抽象层, 上层调用它

php核心构成图

二、走向开发(编写扩展)

总体步骤

下载PHP源码

要开发PHP扩展,第一步要下载PHP源代码,因为里面有开发扩展需要的工具。

下载地址: wget http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror

生成扩展组件框架

ext_skel 命令

./ext_skel --extname=myext 会生成扩展基础文件夹及文件 php-5.5.38/ext/myext/

修改配置文件

修改config.m4文件,去掉配置前的dnl

config.m4: 这是Unix环境下的Build System配置文件,后面将会通过它生成配置和安装。

修改配置config.m4

编写核心函数(可用默认的)

步骤如下(myext.c):

1、使用宏PHP_FE将函数加入到myext_functions中

2、使用宏PHP_FUNCTION定义函数体

扩展c文件myext.c

编译扩展+重启

1、调用phpize程序生成编译配置文件 cd myext && phpize

2、编译扩展库 ./configure --with-php-config=/Data/apps/php/bin/php-config

3、make

4、make test

5、sudo make install生成myext.so 文件

6、 sudo vim /Data/apps/php/lib/php.ini 加上 extension=myext.so

7、 sudo /Data/apps/php/sbin/php-fpm reload

修改php配置文件,添加扩展

三、了解原理

php的生命周期

php的变量在内核--写时复制

php的变量在内核--底层代码对比

php的变量在内核--结构体表示

HashTable分析--结构体

HashTable分析--绘图表示

Zend引擎API

四、写在最后

php的核心是C语言,核心引擎是Zend,了解HashTable就能了解php的精髓。php的扩展开发说到底是C语言的编写,更见底层功力,希望大家都能成为技术大牛。

最后,预祝大家2018年万事如意,心想事成!

本文来自企鹅号 - 程序员的文娱情怀媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏铭毅天下

干货 | 知识库全文检索的最佳实践

很多文档已经被转化成扫描版的PDF,之前我们认为PDF类型是最终的文档格式,现在看来,我们想听听建议(比如:xml是不是更好呢?)

601
来自专栏苍云横渡学习笔记

【第二部分-django博客从搭建到部署】一个完整Django入门指南

【学习目录】 【第一部分-django博客从搭建到部署】一个完整的Django入门指南学习笔记 【第二部分-django博客从搭建到部署】一个完整的Django...

3825
来自专栏吉浦迅科技

在Jetson TX2上编译模块

1824
来自专栏FreeBuf

收集各类安全设备、Nginx日志实现日志统一管理及告警

近来安全测试项目较少,想着把安全设备、nginx日志收集起来并告警, 话不多说,直接说重点,搭建背景:

1247
来自专栏北京马哥教育

MySQL Master High Available 理论篇(二)

六、核心参数详解 6.1 参数矩阵图 ? ? Local Scope 每个server域的参数 在application 配置文件(app.cnf)中:[ser...

2677
来自专栏Hadoop实操

如何在Hive & Impala中使用UDF

本文档讲述如何开发Hive自定义函数(UDF),以及如何在Impala中使用Hive的自定义函数,通过本文档,您将学习到以下知识:

60916
来自专栏程序猿DD

spring-boot-starter-swagger迎新伙伴支持,加速更新进度(1.3.0.RELEASE)

从该starter创建至今收到了不少使用反馈,同时也有不错的童鞋申请加入一起维护。本篇先欢迎小火童鞋的加入及贡献,接下来具体说说本次的更新内容。 本次更新主要新...

3245
来自专栏Golang语言社区

golang使用protobuf

为什么要使用protobuf 最近的项目中,一直使用Json做数据传输。Json用起来的确很方便。但相对于protobuf数据量更大些。做一个移动端应用,为用户...

3905
来自专栏lonelydawn的前端猿区

基于java swing的设备管理系统

一.系统介绍 一个简易的设备管理系统,包含了管理员登录注册、设备录入、设备状态管理功能,具体状态有购买时、正在运行、正在修理和已报废。 二.开发环境 开发环境:...

2017
来自专栏代码GG之家

开机向导到联网状态,一直失败问题 分析

1516

扫码关注云+社区