码迷,mamicode.com
首页 > 其他好文 > 详细

__halt_compiler()的一些总结

时间:2015-06-18 11:31:16      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:php   compiler   base64   


  • __halt_compiler(),顾名思义,是让编译器停止编译的函数,当编译器执行到这之后就不再去解析(parsing)后面的部分了。需要注意的是,该函数需要在php文件的最外层直接使用,不能在函数里使用。

根据php手册上的介绍,该函数常用与在脚本内嵌入数据,类似于安装文件。也就是说在__halt_compiler();后面放一些不需要编译的如:二进制噪音(clutter)、压缩文件等各种类型的文件。如以下代码:

// open this file
$fp = fopen(__FILE__, 'r');
// seek file pointer to data
fseek($fp, __COMPILER_HALT_OFFSET__);
// and output it
var_dump(stream_get_contents($fp));
// the end of the script execution
__halt_compiler(); the installation data (eg. tar, gz, PHP, etc.)
TIP:__COMPILER_HALT_OFFSET__ 常量被用于获取数据字节的开始处。需要有__halt_compiler()才能使用。

  • 接下来,说一个具体的php安装文件的例子:

在php5.1引入__halt_compiler()之前,使用gzdeflat()压缩的文件因为经常含有不能被php 解释器(parser)读取的特殊ASCII码,从而发生错误。为了防止错误的发生就使用base64_encode()来编码gzdeflate()所产生的数据,而这样会造成文件体积增大约33%。这是一种对内存的浪费。

$packed = base64_encode(gzdeflate('the old package'));
//unpacked
$unpacked = base64_decode(gzinflate($packed));
而在有了__halt_compiler()之后,我们就可以不再用base64_encode()进行编码了,而是直接将数据放到__halt_compiler()之后,这样它就不会被编译,从而产生错误了。
// 打开脚本自身文件
$fp = fopen(__FILE__, 'rb');
// 找到数据在文件中的指针
//__COMPILER_HALT_OFFSET__ 将会返回
//__halt_compiler();之后的指针
fseek($fp, __COMPILER_HALT_OFFSET__);
// 输出文件
$unpacked = gzinflate(stream_get_contents($fp));
__halt_compiler();
//now here... all the binary gzdeflate already items!!!


__halt_compiler()的一些总结

标签:php   compiler   base64   

原文地址:http://blog.csdn.net/playyoung/article/details/46544919

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!