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

相关文章

来自专栏我的博客

PHP学习进程

做为一个php痴迷者,我一直想整理一份系列学习php的计划。下面是我学习php进程计划。 1.准备知识:了解html,熟悉div+css,通过设计稿编辑前台 2...

2844
来自专栏Jackson0714

PHP内核之旅-1.生命周期

3066
来自专栏北京马哥教育

小白学Python | 最简单的Django 简明教程

? 一、Django简介 1. web框架介绍 具体介绍Django之前,必须先介绍WEB框架等概念。 web框架: 别人已经设定好的一个web网站模板,你学...

3557
来自专栏张善友的专栏

HTTP Basic Authentication for RESTFul Service

面对用户认证的问题。最常见的实现方式一般是这样的:用户提交一个含有用户名和密码的表单,服务端脚本验证其合法性,如果通过验证,则在Session里标识一下,如此一...

20910
来自专栏吴老师移动开发

【iOS开发】启动时间优化,runloop的一个小技术点

刚接触项目不久,最近产品说有一个点要优化,App的启动页面显示时间太长了。一直在开发其它的app,还真没注意这个点,去看了一下还真是,有的时候启动页面的显示时间...

812
来自专栏腾讯Bugly的专栏

dex分包变形记

一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。这一问题意...

32911
来自专栏java工会

Linux Shell从入门到删除根目录跑路指南

shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭...

663
来自专栏Jimoer

Java设计模式学习记录-命令模式

这次要介绍的是命令模式,这也是一种行为型模式。最近反正没有面试机会我就写博客呗,该投的简历都投了。然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的...

771
来自专栏Coding01

推荐一款 phpcs 插件规范 Laravel 代码 (规范从本地写代码到版本控制)

我相信每个公司都有一套完备的代码规范标准,但标准是标准,如何能有效的让所有人遵守,那就要工具的辅助和实时提醒了。

874
来自专栏Golang语言社区

用 Go 写一个轻量级的 ssh 批量操作工具

大家都知道 Ansible 是功能超级强大的自动化运维工具,十分的高大上。太高大上了以至于在低端运维有点水土不服,在于三点:

2522

扫码关注云+社区