Source code
Login
Home
Articles
Open-Source
Pictures
About Me
Documents
Hot
1
汇编第五章
2
unix文件
3
ubuntu使用root用户登陆14-15版本可用
4
PHP-GTK2-文档学习&翻译——教程部分表格布局使用GtkTable
5
解决LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
6
时钟
7
php导出数据到xls文件
8
Windows GUI开发在控制台打印输出
9
Vim设置字体linux和windows
10
对象代理
Links
网易云课堂
简明现代魔法
看风景
果壳网看科技
下厨房
Redis官网
nginx官网
Mysql文档
持续集成项目travis-c...
在线图书创作Leanpub
PHP-CPP
值得推荐的C/C++库和框架
腾讯一个php
Jquery插件库网站
phpstorm免费注册码
Game And C 老外
owent-ACM-Cpp-...
开源应用程序架构
QTCN开发网
OAuth2协议
SwiftChinese
香草/Vanilla是一个基...
个人征信查询
A set of PHP l...
知行一 | 顶级C++社区
国外QT支持站
WebGL中文网-three...
UE4学习资源合集
https://www.ma...
cppcon
C++官方文档
C++中文友好文档
阿里云珍贵技术资料免费下载
LoL查询
opengl-tutoria...
WebGl版本支持检测网址
OpenGL API Doc...
Git 在团队中的最佳实践-...
A successful G...
GLAD- 比glew更好的...
OpenGL模型导入库-As...
WebGL-火狐doc
如何开发一款游戏:游戏开发流...
Shader
nodejs中文网
Dracula-A dark...
即时通讯网
https://apizza...
sweetalert
伯乐在线github
阿里巴巴免费图标
opengl特效
看见统计
codewars算法挑战1
leetcode算法挑战2
PHP列续松博客
electron-vue文档
Vue Cli 3.0
element-ui
翻墙
Golang ORM ——G...
访客地图
PHP扩展Runkit——服务端代码动态更新利器
张成
2016/7
2521
#PHP扩展Runkit——服务端代码动态更新利器 ### 适用场景 后台系统服务进程,一般通过检查代码文件修改时间,然后执行runkit扩展函数,进行代码更新,改变内存中当前PHP的某类,函数,常量的定义,添加删除修改初始定义。通过此扩展能够实时改变代码的实现。实际就是改变zend内部数据结构指针,指向新的实现。 ### 常用类型 1. 类的操作 添加类的继承类 function E($var = '') { var_dump($var); echo "
"; } class myParent { function parentFunc() { E("Parent Function Output"); } } class myChild { function selfFunc() { E("myChild Output"); } } $convert = runkit_class_adopt('myChild','myParent'); if($convert === true) { //继承一个类 类myChild 继承了 myParent类 myChild::parentFunc(); myChild::selfFunc(); } 移除一个类的继承类 //移除 一个类的继承类 class myParent2 { function parentFunc () { E("Parent2 Function Output"); return 100; } } class myChild2 extends myParent2 { } myChild2::parentFunc(); $convert = runkit_class_emancipate('myChild2'); var_dump($convert); 添加类的常量 if(runkit_constant_add('MyConstatns::ZHANGCHENG','zhangcheng')) { E(MyConstatns::ZHANGCHENG); } 重定义类的常量 if(runkit_constant_redefine('MyConstatns::NAME','zc') ) { E(MyConstatns::NAME); } 删除一个类的常量的定义 if(runkit_constant_remove('MyConstatns::NAME')) { if( !defined('MyConstatns::NAME') ) { E('MyConstatns::NAME is not defined'); } } 重新定义整个类 //import新文件 替换原来的 class TestImportClass { function __construct() { echo "TestImportClass V1
"; } function dump() { echo "dump V1
"; } } $obj = new TestImportClass(); $obj->dump(); if( runkit_import('import_class.inc',RUNKIT_IMPORT_CLASS_METHODS)) { //未能覆盖原方法 $obj->dump(); } if( runkit_import('import_class.inc',RUNKIT_IMPORT_OVERRIDE | RUNKIT_IMPORT_CLASSES)) { //改变了原方法 $obj->dump(); new TestImportClass(); } inc文件如下 class TestImportClass { function __construct() { echo "TestImportClass V2
"; } function dump() { echo "IMPORT DUMP
"; } } 拷贝一个类的方法到另外一个类 class TestNewClass { } if( runkit_method_copy('TestNewClass','add_method','TestImportClass','add_method')) { $newobj = new TestNewClass(); $newobj->add_method('this is method copied from TestImportClass'); } 2.函数操作 添加函数 if( runkit_function_add('test_temp_func','$a,$b','echo "The value of a is $a + $b = ".($a+$b);') ) { test_temp_func(1,2); echo "
"; } 修改函数 //修改函数 如修改内部函数 需要设置 runkit.internal_override if( runkit_function_redefine('funcA2','','E("funcA2 edit version");')) { funcA2(); } 删除函数 if( runkit_function_remove('funcA2') ) { if( ! function_exists('funcA2')){ E('runkit remove function funcA2 success'); } } 重命名函数 if( runkit_function_rename('funcA','funcA_other') ) { if( ! function_exists('funcA')){ E('funcA not exists'); } if( function_exists('funcA_other')) { E('funcA_other exists'); funcA_other(); } }
上一篇:
C++并发——C++并发世界
下一篇:
nginx模块开发步骤图
Please enable JavaScript to view the
comments powered by Disqus.