《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 条评论
登录 后参与评论

相关文章

来自专栏维C果糖

史上最简单的 MySQL 教程(一)「数据库」

数据库,可以简单的解释为:高效的存储和处理数据的介质(主要分为磁盘和内存两种)。

39113
来自专栏Java技术交流群809340374

主流RPC框架详解,以及与SOA、REST的区别

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术...

2.2K4
来自专栏FreeBuf

如何利用Ptrace拦截和模拟Linux系统调用

ptrace(2)这个系统调用一般都跟调试离不开关系,它不仅是类Unix系统中本地调试器监控实现的主要机制,而且它还是strace系统调用常用的实现方法。ptr...

1537
来自专栏飞雪无情的博客

Go语言实战笔记(十二)| Go goroutine

一般的程序,如果没有特别的要求的话,是顺序执行的,这样的程序也容易编写维护。但是随着科技的发展、业务的演进,我们不得不变写可以并行的程序,因为这样有很多好处。

993
来自专栏Java技术分享圈

杨老师课堂之JavaWeb体系的MVC与三层架构有什么区别

三层架构通常包括表示层,业务逻辑层以及数据访问层。虽然三层架构将系统在逻辑上分成了三层,但是它并不是物理上的分层。也就是说,对不同层的代码而言,经历编译、打包、...

582
来自专栏分享达人秀

掌握Android Studio项目结构,扬帆起航

经过前面的学习,Android Studio开发环境已准备OK,运行Android应用程序的原生模拟器和Genymotion模拟器都准备妥当。在之前简单...

31110
来自专栏向治洪

Rest api简介

理解和使用内容协商 我们的开发者在发送一个 REST API 请求的同时,根据应用场景,针对相同的资源,可能会期待不同的返回形式。 比如,我希望根据用户客户端语...

2076
来自专栏运维小白

10.23 linux任务计划cron

Linux任务计划 crontab -u、-e、-l、-r 格式:分 时 日 月 周 user command 文件/var/spool/cron/userna...

1919
来自专栏用户2442861的专栏

Thrift 服务器端的几种工作模式分析

相关示例代码见:http://download.csdn.net/detail/hjx_1000/8374829

2232
来自专栏程序员的知识天地

Linux 系统结构详解

内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-...

2722

扫码关注云+社区