实现PHP的编译执行分离(separatingcompilation and execution)
来源:互联网 发布:中国保险网络大学注册 编辑:程序博客网 时间:2024/04/30 08:29
· 作者: Laruence( )
· 本文地址: http://www.laruence.com/2008/08/14/250.html
· 转载请注明出处
刚刚在PHP群内和大家聊天,应承了大家要写一个关于如何实现PHP源码加密的文章,借着这会QA在冒烟的机会,就这个问题,我写点思路。
我之前的文章介绍过, ZE(Zendengine)执行一个PHP脚本会经历编译->执行,只不过它每次执行都会去重新编译PHP文件。并没有实现编译和执行分离。
在ZE的编译和执行阶段,有俩个重要的函数:
1. ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
和
1. ZEND_APIvoid (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
2.
zend_compile_file负责将要执行的脚本文件编译成由ZE的基本指令序列构成的opcodes ,然后将op codes交由zend_execute执行,从而得到我们脚本的结果。
所以,我们完全可以通过修改默认的zend_complie_file和zend_execute来实现,PHP的执行和编译分离,进一步,我们还可以再这个基础上实现,对我们脚本的加密和解密。
我们通过一个PHP扩展模块来实现这个功能,首先,我们需要在模块初始化的时候:
1. PHP_MINIT_FUNCTION(sample)
2. {
3. old_compile_file = zend_compile_file; //保存现场
4. old_execute = zend_execute;
5.
6. zend_compile_file = my_compile_file;//截获
7. zend_execute = my_execute;
8. return SUCCESS;
9. }
在我们的my_compile_file中,判断我们的文件是否是编译过的文件,假设后缀名是 *.ze
1. static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
2. {
3. if(strstr(file_handle->filename,".ze") != NULL){//是编译过的文件。
4. 直接返回文件内容.
5. }
6. zend_op_array *op_array;
7.
8. op_array =old_compile_file (file_handle, type TSRMLS_CC);//调用默认的compile,截获输出
9.
10. if(op_array){
11. 保存op_array;
12. }
13. return op_array;
14. }
这样,我们就实现了,对已经编译文件的支持,和对文件编译的支持。
然后,需要编写我们的执行函数:
1. static voidmy_execute(zend_op_array *op_array TSRMLS_DC)
2. {
3. old_execute(op_array TSRMLS_DC);//简单交由默认执行函数执行。
4. }
也许你要问为什么要包装以后的执行函数,呵呵,我只是为了说明,一种方式,就是可以截获这个东东而已。。有什么用,就看读者你有什么要求能通过这个方式实现了;)
恩,写到这里,你也许就明白了,如果想要对文件加密,那么就定义个加密文件类型,比如 *.zec,然后在my_compile_file中,判断文件类型,如果是加密文件,那么就执行解密,;),嘿嘿,简答吧?
至于怎么加密,,,那就要问你自己了,你想用什么方式,,,但是,记住,要可逆的哦~~ ^_^。
- 实现PHP的编译执行分离(separatingcompilation and execution)
- PHP:编译-执行 分离
- php脚本的执行过程(编译与执行相分离)
- php脚本的执行过程(编译与执行相分离)
- php脚本的执行过程(编译与执行相分离)
- 【转-来自鸟哥】关于 PHP 的编译和执行分离
- PHP实现的Mysql读写分离
- PHP实现的Mysql读写分离
- PHP实现的Mysql读写分离
- PHP实现的Mysql读写分离
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- 模板的分离编译
- python:安装numpy, Scipy,Matplotlib
- PINBLOCK计算方法
- 8.2.1.3 Range Optimization 范围优化
- Spring 和EJB终于统一融合(转)
- Qt 元对象系统 一
- 实现PHP的编译执行分离(separatingcompilation and execution)
- angular 封装 Jquery插件时作用域问题
- HDU 1038.Biker's Trip Odometer【单位换算】【水水水】【8月24】
- PHP的单引号和双引号
- POJ 3321 Apple Tree 树状数组
- 使用Go快速创建静态服务
- EBS中odf文件和xdf文件解释
- hdu--5137
- 8月7日 XE8移动开发入门(一) RadStudio XE8开发环境简介(免费培训)