探索嵌入式PHP与C/C++结合的无限种可能

内容来源:2018 年 5 月 20 日,腾讯企点开放平台技术负责人熊月在“PHPCon China 2018 技术峰会”进行《嵌入式PHP的探索实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2410 | 7分钟阅读

摘要

对于拥有很多复杂业务场景的tob领域,“开发效率”和“性能”常常是我们考虑的两个主要问题,PHP作为脚本语言,本身适用于快速开发业务逻辑,同时为了解决PHP特定的性能瓶颈,一般将C++/PHP结合,在PHP代码里调用C/C++扩展。 这次我们带来了不同思路的探索:将php嵌入到高性能C/C++框架运行,将C/C++框架作为容器,完美结合php快速开发优势和C/C++高性能特点。Zend Engine提供了一种嵌入式开发模式,我们利用这一特性使它可以在C/C++的环境中单独执行PHP脚本,并且支持多实例运行,可以在C/C++协程框架中运行。嵌入式PHP也为在任意C/C++协程框架结合带来无限可能,包括在C++的客户端上运行PHP。

获取嘉宾演讲视频及PPT,扫一扫下方二维码即可。

嵌入式PHP

作为一门后台开发语言PHP有着不同的发展阶段。最开始是大家都比较熟悉的LAMP,接着是PHP-fpm和fastcgi,再往后是swoole,之后在swoole的基础上又新增了协程。

为了便于理解,在介绍嵌入式PHP之前要先讲下SAPI的概念。SAPI即后台应用程序编程接口,是PHP与其他应用程序交互的接口。常见的SAPI有cgi、fpm、cli、Apace2 hander,而嵌入式PHP(embed)也是其中一类。

业务场景

我们最初的业务框架是基于TSF2.0,底层为Zend Engine和扩展,扩展最核心的部分是基于swoole。在此之上是TSF PHP层,包含协程调度器、微服务框架、监控管理进程、MVC模式。最上层才是真正的执行逻辑的PHP脚本。

这样一套框架存在几个问题。PHP原生的Generator协程需要配合yield使用,对开发来说不怎么友好,因为yield的使用时机不太好确定,尤其是对于新手。由于协程调度器是用原生PHP实现的,因此相对其他语言在性能上会差些,特别是在高并发场景下。还有就是低版本swoole不够稳定,问题最多的就是在内存泄露这块。大家都知道腾讯内部有很多公用组件,这些组件接口大多是用C++实现的,为此我们需要做的是用扩展对接PHP与其他组件,而问题就在于扩展无法使用上层的PHP协程。

方案:SPP+PHP

为什么选择嵌入式PHP

SNG中有个非常有名的C++后台框架SPP,它是一个高性能的网络框架,起始于2008年,被广泛的应用于SNG的各个业务线。众所周知开发效率一直是PHP的长处,性能方面则是短板。所以我们就在想能不能将SPP和PHP结合起来兼顾高性能和开发效率,嵌入式PHP无疑是很好的结合方案。

SPP主要有5个模块。proxy用来处理新请求,内存队列是proxy和workgroup交互的内存区域,workgroup是和后台逻辑脚本交互的模块,controller作为控制核心来控制proxy和workgroup的运行状态,最后是最重要的协程模块。

如何将SPP和Zend结合

SPP其实是基于协程的框架,协程是一个用户态的多线程概念。在协程切换的时候会涉及内存管理的机制,而Zend没有这种切换内存资源的机制,只有全局变量和多线程资源隔离的方式。这样的话要想将SPP和Zend结合起来,就要对Zend进行改造。

Zend的源码大概有60万行,如果直接改动核心源码,不光实施起来很麻烦,对之后的升级也会造成问题。最好的办法是借助Zend本身的机制对入口进行改造,而不侵入内核。

Zend改造

Zend有多进程和多线程两种方式,在多线程模式下有一个线程安全的机制ZTS。ZTS本质其实是对每个线程的全局资源进行了隔离,与SPP协程的结合就需要用到ZTS,下面是具体步骤。

第一步当然是打开Zend内核ZTS开关,第二步为了满足协程上下文切换,需要将ZTS中的线程私有变量转化为全局数据元素,第三步增加资源入口切换API。做完这三步就完成了Zend和SPP的结合,虽然步骤不多但实际上在做的过程中还是会有很多挑战。

PHP执行流调度器

解决了结合问题之后,接下来为了将整个流程串起来需要有一个执行流程调度器。上图是整个执行流程,首先SPP通过SAPI进入到Zend中,然后Zend执行PHP脚本,先编译成OpCode,之后如果有网路IO就会用到协程。协程也可以基于SPP提供的API来运作,通过Tsrm的全局资源table可以进行协程切换。

在有这样一套执行流的情况下,扩展也可以依赖SPP的API实现协程调度。

上图是SPP结合PHP之后的整体架构。最底层是SPP,往上是PHP执行流调度器,中间是PHP内核和扩展,最上层是PHP脚本。这一整套架构以嵌入式的方式结合了SPP和PHP,让开发者既可以利用SPP提供的高性能网络框架,同时也能应用到上层PHP快速开发的特点。

这里展示的是压测时候的环境数据,包括机型、压测工具、压测方法以及框架的版本等。

这是压测后获得的实际数据对比,可以看到SPP-PHP框架相对旧的框架性能上大概有3倍的提升。

以上为今天的分享内容,谢谢大家!

IT大咖说 | 关于版权

本文由“IT大咖说(ID:itdakashuo)”原创,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2018-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

通用型系统架构设计

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总...

2813
来自专栏程序员宝库

Golang 大杀器之性能剖析 PProf

想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下:

3033
来自专栏魏琼东

AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速...

22510
来自专栏雨过天晴

初窥dep

6898
来自专栏Java技术分享

java系统高并发的解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求...

7778
来自专栏phodal

\b这样去设计 URL,可以提高网站的访问量

今天,很多网站的 URL 的设计都是“有问题”的。它们看起来一塌糊涂,仿佛是被人洗掉的脏数据一样,没有经过设计,没有经过思考。他们一点都不适合阅读,也不利于搜索...

2028
来自专栏乐百川的学习频道

使用 you-get 下载视频

安装you-get 最近刚刚看完了Python的官方教程,准备研究一下Python的第三方库。想起来以前看到过一个很不错的视频下载工具you-get,今天正好来...

8265
来自专栏施炯的IoT开发专栏

Microsoft IoT Starter Kit 开发初体验-反馈控制与数据存储

    在上一篇文章《Microsoft IoT Starter Kit 开发初体验》中,讲述了微软中国发布的Microsoft IoT Starter Kit...

2295
来自专栏Java技术分享

java系统高并发的解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要...

9219
来自专栏电光石火

idea 创建的maven+spring+mybatis项目整合 报错无法创建bean

最近在做一个由maven构建的spring+spring mvc+mybatis项目,刚开始的时候是用自己的电脑Win10环境下的eclipse写的,托管到了码...

1988

扫码关注云+社区

领取腾讯云代金券