- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
企点嵌入式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 +客户 代码 端