日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP擴展之壓縮與歸檔擴展2——Phar

瀏覽:197日期:2022-09-15 15:12:13

Phar 歸檔的概念來自 Java? 技術的 JAR 歸檔,它允許使用單個文件打包應用程序,這個文件中包含運行應用程序所需的所有東西。該文件不同于單個可執行文件,后者通常由編程語言生成,比如 C,因為該文件實際上是一個歸檔文件而非編譯過的應用程序。因此 JAR 文件實際上包含組成應用程序的文件,但是考慮到安全性,不對這些文件進行仔細區分。Phar 擴展正是基于類似的理念,但是在設計時主要針對 PHP 的 Web 環境。同樣,與 JAR 歸檔不同的是,Phar 歸檔可由 PHP 本身處理,因此不需要使用額外的工具來創建或使用。

Phar 擴展對 PHP 來說并不是一個新鮮的概念。它最初使用 PHP 編寫并被命名為 PHP_Archive,然后在 2005 年被添加到 PEAR 庫。然而在實際中,解決這一問題的純 PHP 解決方案非常緩慢,因此 2007 年重新編寫為純 C 語言擴展,同時添加了使用 SPL 的ArrayAccess?對象遍歷 Phar 歸檔的支持。自那時起,人們做了大量工作來改善 Phar 歸檔的性能。

創建 Phar

創建 Phar 文件需要執行若干步驟。所有步驟需要用到某種形式的 PHP 命令完成創建,因為不存在用于創建歸檔的獨立工具。此外,要創建和修改 Phar 文件,php.ini 設置 phar.readonly 必須被設置為 0。在 PHP 的 Phar 歸檔內打開和引用文件時不需要使用到該設置。

讓我們看一看創建可用于驅動應用程序的 Phar 文件需要哪些步驟。應用程序的設計目標是從 Web 瀏覽器或命令提示符直接加載。第一步是創建 Phar 文件,因此我們將創建清單 1 所示的?Phar?對象。對象引用將允許您控制 Phar 歸檔的所有方面。

示例 1. 創建?Phar?對象

$p = new Phar(’/path/to/my.phar’, CURRENT_AS_FILEINFO | KEY_AS_FILENAME, ’my.phar’);$p->startBuffering();

構造函數的第一個參數表示保存 Phar 文件的位置。第二個參數將所有參數都傳遞給?RecursiveDirectoryIterator?父類。第三個參數是在流上下文中引用 Phar 歸檔的別名。因此對于清單 1,可以在這個 Phar 歸檔中使用 phar://my.phar 引用文件。您還可以發出Phar::startBuffering()?方法調用來緩沖對歸檔做出的修改,直到發出?Phar::stopBuffering()?命令為止。盡管不一定要執行上述操作,但是這樣做確實改善了創建或修改歸檔的性能,因為它避免了每次在腳本中修改歸檔時對做出的修改進行保存。

默認情況下,創建的 Phar 將使用原生的基于 Phar 的歸檔格式。還可以按照清單 2 所示將格式轉換為 ZIP 格式,從而對 Phar 文件使用 ZIP 或 TAR 格式。示例 2. 將存儲格式轉換為 ZIP 格式

$p = $p->convertToExecutable(Phar::ZIP);

轉換歸檔格式有利也有弊。主要優點就是能夠使用任何處理 ZIP 或 TAR 文件的工具查看歸檔的內容。然而,如果 Phar 歸檔沒有使用原生的基于 Phar 的歸檔格式,那么它不需要使用 Phar 擴展加載歸檔,而使用 ZIP 或 TAR 格式的 Phar 歸檔則需要如此。

接下來,將需要定義文件存根(stub),這是在加載 Phar 文件時首先調用的代碼。

Phar 文件存根

文件存根僅僅是在加載 Phar 文件時最初運行的代碼的一小部分,并且始終以一個?__HALT_COMPILER()?標記作為結束。清單 3 展示了一個典型的文件存根。示例 3. Phar 文件存根

<?php Phar::mapPhar(); include ’phar://myphar.phar/index.php’; __HALT_COMPILER();

上面所示的?Phar::mapPhar()?方法調用通過讀取清單文件(manifest)對 Phar 歸檔執行初始化。您需要在歸檔內引用文件之前使用 phar:// 流包裝器執行初始化。初始加載的文件將是應用程序首次加載時的文件;在本例中為 index.php。

如何將這個文件存根 Phar 添加到 Phar 歸檔取決于所使用的歸檔的格式。對于基于 Phar 的歸檔,使用?Phar::setStub()?方法,它將接受 PHP 代碼的惟一參數,并以字符串形式放入存根中。清單 4 演示了這一方法。示例 4. 使用?Phar::setStub()?創建文件存根

$p->setStub(’<?php Phar::mapPhar(); include ’phar://myphar.phar/index.php’; __HALT_COMPILER(); ?>’);

如果您計劃使用存根而不是重定向到 index.php 頁面來完成操作,可以使用 helper 方法?Phar::createDefaultStub()?構建文件存根。因此,只需要傳遞您希望包含在文件存根的文件的名稱。在清單 5 中,將重寫?Phar::setStub()?方法調用來使用 helper 方法。

示例 5. 使用?Phar::createDefaultStub()?創建文件存根

$p->setStub($p-> createDefaultStub(’index.php’));

如果從 Web 服務器加載 Phar,Phar::createDefaultStub()?方法的第二個可選參數允許包含一個不同的文件。這對于設計用于命令行或 Web 瀏覽器上下文的應用程序非常方便。

對于基于 ZIP 和 TAR 的實現,將以上存根的內容存儲到 .phar/stub.php 文件內,而不是使用?setStub()?命令。

將文件添加到歸檔

Phar?對象使用?ArrayAccess?SPL 對象,允許以數組的形式訪問歸檔內容,因此提供了許多方法來向歸檔添加文件。最簡單的方法是直接使用?ArrayAccess?接口。示例 6. 向歸檔添加文件

$p[’file.txt’] = ’This is a text file’;$p[’index.php’] = file_get_contents(’index.php’);

示例 6 表明文件名被指定為數組鍵,將內容指定為值。可以使用?file_get_contents()?函數獲得現有文件的內容,然后將內容設為值。這樣可以更加靈活地向歸檔添加文件,可以通過引用現有文件或動態構建文件實現。后一種方法可以作為應用程序構建腳本的一部分。

如果存儲在 Phar 歸檔中的文件非常大,可以分別通過?PharFileInfo::setCompressedGZ()?或PharFileInfo::setCompressedBZIP2()?方法使用 gzip 或 bzip2 壓縮有選擇地壓縮歸檔中的文件。在清單 7 中,您將使用 bzip2 壓縮文件。示例 7. 使用 bzip2 壓縮 Phar 歸檔中的文件

$p[’big.txt’] = ’This is a big text file’;$p[’big.txt’]->setCompressedBZIP2();

要壓縮文件或使用包含壓縮文件的歸檔,必須在 PHP 安裝中支持 bzip2 或 zlib(用于 gz 壓縮文件)擴展。

假設您需要將許多文件加入到歸檔中。使用?ArrayAccess?接口逐一添加文件是一項非常單調的工作,因此可以使用一些便捷的方法。一種方法就是使用?Phar::buildFromDirectory()?方法,該方法將遍歷指定的目錄并添加其中的文件。它還支持對添加的文件進行過濾,方法是使用文件的正則表達式模式傳遞第二個參數,以匹配文件并添加到歸檔中。清單 8 展示了這一過程。示例 8. 使用?Phar::buildFromDirectory()?向歸檔添加文件

$p->buildFromDirectory(’/path/to/files’,’./.php$/’);

示例 8 將指定目錄中的 PHP 文件添加到 Phar 歸檔。如果需要對添加的文件執行任何修改,比如將文件壓縮,那么可以使用ArrayAccess?接口返回。

可以使用一個迭代器(iterator)通過?Phar::buildFromIterator()?方法添加文件。支持兩種風格的迭代器:一種是將 Phar 中的文件名映射到磁盤文件的名稱,另一種是返回?SplFileInfo?對象。RecursiveDirectoryIterator?是一種兼容的迭代器,下面展示如何使用它向歸檔添加目錄文件。示例 9. 使用?Phar::buildFromIterator()?向歸檔添加目錄文件

$p->buildFromIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(’/path/to/files’)),’/path/to/files’);

Phar::buildFromIterator()?方法接受迭代器對象本身作為惟一的參數。在上例中,您已經使用RecursiveIteratorIterator?對象包裝了?RecursiveDirectoryIterator?對象,RecursiveIteratorIterator?對象提供了Phar::buildFromIterator()?方法所需的兼容型迭代器。

我們現在已經創建了一個 Phar 歸檔,它可以用于任何 PHP 應用程序。讓我們看一看如何方便地使用這個歸檔。

使用 Phar 歸檔

Phar 歸檔的一個優點就是可以非常方便地集成到任何應用程序中。如果使用的是原生的基于 Phar 的歸檔格式,這一點尤其明顯。在這種情況下,您甚至不需要安裝 Phar 擴展,因為 PHP 天生就可以加載文件并提取文件內容。基于 ZIP 和 TAR 的歸檔需要加載 Phar 擴展。

Phar 歸檔在設計時被包括到應用程序中,跟普通的 PHP 文件一樣,這使得已經熟悉如何包含其他第三方代碼的應用程序開發人員可以非常方便地使用 Phar 歸檔。讓我們看一看在應用程序中集成 Phar 有多么容易。

在應用程序中集成 Phar 歸檔代碼

在 Phar 歸檔中集成代碼的最簡單方法就是包含 Phar 歸檔,然后在 Phar 文件中包含需要使用的文件。phar:// 流包裝器可以用來訪問已加載 Phar 歸檔中的文件,如下所示。示例 10. 在 Phar 歸檔中加載代碼

include ’myphar.phar’; include ’phar://myphar.phar/file.php’;

第一個 include 將加載 myphar.phar 歸檔,包含文件存根中指定的代碼。第二個 include 使用流包裝器打開 Phar 歸檔并且僅在歸檔中包括指定的文件。注意在歸檔中包含文件之前,您不需要包含 Phar 歸檔本身,如清單 10 所示。

從 Phar 歸檔運行 PHP 應用程序

Phar 歸檔的一個出色特性就是可以使用一個 Phar 歸檔打包整個應用程序并進行發布。這種方法的優點就是簡化應用程序部署并且不會降低性能,它主要得益于 PHP V5.3 中新增的若干 Phar 增強。然而,設計在 Phar 中運行的應用程序時應當考慮以下幾點:

任何需要創建的特定于應用程序實例的文件,比如 config 文件,都不能作為歸檔的一部分,因此需要將它們寫入到獨立但是可訪問的位置。如果應用程序創建構成擴展的緩存文件,那么這些文件也要采用相同的做法。您應當始終使用基于 Phar 的歸檔格式,并且不對歸檔中的文件進行壓縮,從而獲得最大的靈活性。基于 ZIP 和 TAR 的歸檔要求在 PHP 中安裝 Phar 擴展,而基于 Phar 的歸檔甚至可用于未安裝 Phar 擴展的情況。應用程序中的任何文件引用都需要修改為同時使用 phar:// 流包裝器和歸檔名,如前面小節所示。

PHPMyAdmin 是一種流行的 PHP 應用程序,它一直使用 Phar 打包,演示出使用 Phar 歸檔的簡便性。它一直以來被設計為從 Phar 歸檔文件運行,但是仍然能夠在 Phar 歸檔之外存儲配置文件。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品一区二区三区美女 | 日韩一区二区免费看| 欧美国产日韩电影| 91精品国产91久久久久久黑人| 给我免费播放日韩视频| 免费亚洲一区| 九九99久久精品在免费线bt| 欧美成人一二区| 色爱综合网欧美| 久久久国产精品一区二区中文| 精品捆绑调教一区二区三区 | 日韩欧美一区二区三区免费看| 日韩综合一区| 亚洲国产一区二区在线观看 | 精品一区二区三区中文字幕| 国产精品久久久久久久久久10秀| 毛片在线网站| 亚洲电影在线| 亚洲精品视频一二三区| 日本免费一区二区视频| 国产欧美一级| 国产精品国产一区| 精品国产91| 成人国产精品| 黄色日韩精品| 日本视频在线一区| 国产一区二区三区探花| 国产激情一区| 国产福利片在线观看| 久久久成人网| 亚洲我射av| 精品精品久久| 欧美不卡高清一区二区三区| 欧美日韩在线网站| 日韩av中文字幕一区二区| 久久狠狠亚洲综合| 亚洲欧洲美洲av| 91久久久久| 一区二区电影在线观看| 日韩av中文字幕一区二区 | 国产精品综合色区在线观看| 精品久久国产一区| 久久蜜桃av| 奇米色欧美一区二区三区| 成人一区不卡| 欧美日韩在线精品一区二区三区激情综合| 麻豆一区二区三| 夜夜精品视频| 精品国产欧美日韩| 丝袜美腿一区二区三区| 国产精品免费精品自在线观看| 一本一道久久a久久| 日韩精品一二区| 日韩电影免费网站| 欧美成人精品一级| 亚洲精品中文字幕99999| 久久中文在线| 欧美日韩亚洲一区二区三区在线| 欧美日韩水蜜桃| 另类小说一区二区三区| 99re国产精品| 欧美日韩国产高清| 播放一区二区| 国内不卡的一区二区三区中文字幕| 国产午夜久久| 国产精品久久久久久久久久10秀| 偷拍精品精品一区二区三区| 日本午夜精品| 亚洲色图网站| 日韩制服丝袜先锋影音| 免费污视频在线一区| 高清一区二区| 91av亚洲| 久久久夜夜夜| 欧美日韩激情| 噜噜噜躁狠狠躁狠狠精品视频| 不卡一区2区| 99xxxx成人网| 综合亚洲自拍| 日韩国产成人精品| 日本亚洲不卡| 欧美二区视频| 欧美肉体xxxx裸体137大胆| 国产91欧美| 激情91久久| 一区二区不卡| 国产精品久久久久77777丨| 欧美成人一二区| se01亚洲视频 | 日韩激情综合| 91精品麻豆| 精品丝袜在线| 欧美日韩国产观看视频| 国产精品视频一区视频二区| 老司机免费视频一区二区三区| 91中文字幕精品永久在线| 久久婷婷亚洲| 婷婷久久免费视频| 激情中国色综合| 一本色道精品久久一区二区三区| 首页欧美精品中文字幕| 日韩激情av在线| 国产成人精品亚洲线观看| 欧美午夜精彩| 国产精品videossex久久发布| 日韩伦理一区| 日韩亚洲精品在线观看| 国产乱人伦精品一区| 久久亚洲精品伦理| 国产精品成人自拍| 日韩精品久久久久久久电影99爱| 蜜桃一区二区三区在线| 国产一二在线播放| 日韩精品亚洲专区| 欧美+日本+国产+在线a∨观看| 天堂va在线高清一区| 日本欧美不卡| 欧美黑人做爰爽爽爽| 亚洲日本国产| 好看的亚洲午夜视频在线| 精品国产亚洲一区二区三区| 亚洲精品网址| 丝袜美腿诱惑一区二区三区 | 国产一区二区三区四区大秀| 欧美综合二区| 91精品国产自产在线观看永久∴| 7m精品国产导航在线| 欧美精品一线| 国产亚洲一区二区手机在线观看 | 欧美激情麻豆| 911亚洲精品| 日韩精品五月天| 蘑菇福利视频一区播放| 国产91在线精品| 国产精品第一| 国产精品www.| 综合激情网站| 亚洲永久精品唐人导航网址| 亚洲午夜91| 久久精品影视| 99久久亚洲精品蜜臀| 日韩天堂在线| 久久青草久久| 亚洲无线一线二线三线区别av| 欧美日韩一区二区综合| 婷婷六月综合| 三级亚洲高清视频| 免费欧美在线视频| 国产综合视频| 久久蜜桃精品| 制服诱惑一区二区| 一区二区电影| 91久久久精品国产| 美国三级日本三级久久99| 日韩国产在线一| 国产日韩欧美高清免费| 欧美黑人做爰爽爽爽| 成人日韩av| 午夜久久一区| 一区二区高清| 国产精品天堂蜜av在线播放| 麻豆久久久久久久| 国产99亚洲| 亚洲精品在线国产| 国产精品久久久久久av公交车| 红杏一区二区三区| 国产精品免费看| 国产精品极品| 一本一道久久a久久精品蜜桃| 午夜电影一区| 亚洲在线国产日韩欧美| 日本不卡的三区四区五区| 久久久久久久欧美精品| 99精品在线观看| 日本午夜精品一区二区三区电影 | 蜜桃视频在线网站| 蜜桃91丨九色丨蝌蚪91桃色| 欧美激情福利| 91精品啪在线观看国产18| 久久精品凹凸全集| 精品在线99| 精品国产午夜| 综合激情五月婷婷| 播放一区二区| 久久久久亚洲精品中文字幕| 日韩中文字幕一区二区三区| 精品中文在线| 青草国产精品久久久久久| 激情久久五月| 日韩在线视频精品| 欧美激情91| 色综合视频一区二区三区日韩| 国产精品欧美大片| 日韩一级精品| 午夜影院欧美| 日韩三区在线| 欧洲一区二区三区精品| 亚洲黄色免费看| 国产精品久久久久久久免费观看| 欧美一区不卡|