企点嵌入式PHP的探索实践 熊月 PHPCON2018

对于拥有很多复杂业务场景的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。

展开查看详情

1.数字化全渠道 客户沟通互动平台 腾讯企点(SCRM,社交化客户关系管理平台)基于腾讯的社交、大数据 和AI能力,助力企业更好地连接和理解客户,通过个性化的触达、沟通、 互动,全面升级客户体验,最终提升企业营销、销售、运营和服务的绩效。

2.嵌入式PHP探索实践

3.熊月 8年web后台开发经验。 腾讯企点开放平台技术负责人。 曾任职于中国平安,负责整个平安集团客服核心系统搭建。

4. 吗 PHP是世界上最好的语言吗 ? ? ?

5.CONTENTS ONE 嵌入式PHP TWO 业务场景 • PHP后台开发的高性能发展过程 • 老的业务框架的痛点 • 何为嵌入式PHP • 为什么要有嵌入式PHP的尝试 THREE 方案:SPP+PHP FOUR 未来畅想 • SPP和PHP结合的难点,如何解决 • 嵌入式PHP未来究竟如何发展 • 最终线上运营效果如何

6. 嵌入式PHP 01 • • PHP后台开发的高性能发展过程 何为嵌入式PHP

7.PHP后台开发高性能之路 Swoole ? Swoole + 协程 PHP-fpm LAMP fastcgi

8.嵌入式PHP cgi embed fpm SAPI Apache2 cli hander

9. 业务场景 02 • • 老的业务框架的痛点 为什么要有嵌入式PHP的尝试

10.初代框架

11.初代框架痛点 Generator协程开发不友好 PHP实现调度性能差 Swoole低版本不够稳定 扩展无法使用协程

12. 方案:SPP+PHP 03 • • SPP和PHP结合的难点,如何解决 最终线上运营效果如何

13.为什么选择嵌入式PHP 高性能 性能是痛点 SPP PHP 嵌入式PHP

14.SPP框架

15.如何将SPP协程和Zend结合 SPP Zend

16.ZTS实现原理 1. 新建了两个线程,且尚未分配全局资源

17.ZTS实现原理 2. 分配第一个资源

18.ZTS实现原理 3. 分配第二个资源

19. Zend改造 1. 打开Zend内核 ZTS 开关 2. 线程私有变量 -> 全局数组元素 #ifdef ZTS 3. 增加资源入口切换API # define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v) #else # define EG(v) (executor_globals.v) extern ZEND_API zend_executor_globals executor_globals; /* Thread local storage */ #endif TSRMLS_CACHE_EXTERN() static TSRM_APIpthread_key_t tls_key; void tsrm_switchco(THREAD_T CurCoID) # define tsrm_tls_set(what)pthread_setspecific(tls_key, (void*)(what))type)->element) {#define TSRMG_STATIC(id, type, element)(TSRMG_BULK_STATIC(id, # defineTSRMG_BULK_STATIC(id, #define g_CurCoID tsrm_tls_get()pthread_getspecific(tls_key) = CurCoID; type)((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) #define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE; TSRMLS_CACHE_UPDATE(); #define } TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE __attribute__((visibility("default"))) = NULL; #define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache() void* #define //#if g_apTLS[100000] TSRMLS_CACHE=_tsrm_ls_cache ZEND_DEBUG { 0 }; # defineTSRMLS_CACHE_UPDATE() #define tsrm_tls_set(what)g_apTLS[g_CurCoID] TSRMLS_CACHE = (void*)(what) = tsrm_get_ls_cache() # define TSRM_API //#else tsrm_tls_get()g_apTLS[g_CurCoID] void *tsrm_get_ls_cache(void) {//#define TSRMLS_CACHE_UPDATE() if (!TSRMLS_CACHE) TSRMLS_CACHE = tsrm_get_ls_cache() return tsrm_tls_get(); //#endif } #define TSRMLS_CACHE _tsrm_ls_cache

20.PHP执行流调度器 Lexer SPP SAPI Compilation Parser Emitter Tsrm Lexer 全局资源 OpCode Parser Emitter table Zend VM SPP_API Extention Execution Zend GC Zend MM

21.扩展也可以依赖SPP的API开发

22.SPP+PHP整体架构

23.SPP+PHP性能 • 压测机器 4*CPU 2099 MHz /8G /4*worker • 一次后端请求/三次后端请求/五层类嵌套调用后一次后端请求 • 压测工具1000个连接 (指定速率匀速向目标服务器发送请求,不依赖服务端的返回) • 压测机ping被压测机延时0.1ms左右 • SPP version: SPP_3.0.1_release_0020 • PHP version: 5.6 / 7.1.4 • TSF version: 2-1.0/swoole version: 1.8.10

24.SPP+PHP性能 qps qps 50000 40000 40000 30000 30000 20000 20000 10000 10000 0 0 SPP SPP-PHP 一次 三次 嵌套 TSF SPP-PHP

25. SPP+PHP线上运行效果 TSF 内存稳定 无泄漏 SPP + PHP

26.SPP+PHP线上运行效果 CPU使用率 下降约60%

27. 未来畅想 04 • 嵌入式PHP未来究竟如何发展

28.PHP开发容器 PHP PHPer 快速开发 PHP开发容器 API 高性能

29.PHP嵌入C/C++客户端 C/C+ 客户端 PHP +客户 代码 端