__halt_compiler的一些總結

WBOY
發布: 2016-08-08 09:22:33
原創
1455 人瀏覽過
  • __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教程有興趣的朋友有所幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!