2011-08-02 68 views
6

不確定這是否可行,但現在它已成爲一項學術鬥爭。PHP zip_open()和php:// temp,似乎無法打開

使用__halt_compiler()伎倆在一個PHP文件中嵌入二進制數據,我已經成功地創建了自開幕腳本將fseek()__COMPILER_HALT_OFFSET__不是太難看,因爲這精確的例子是在手動記錄)

不管怎麼說,我已經存儲的二進制數據ZIP的小疙瘩(含一個單一的文件,上面寫着「世界你好」一個文件夾中)我呼籲__halt_compiler()

我所試圖做的是後將數據直接複製到php://temp流,並已成功完成(如果我rewind()passthru()臨時流手柄,它轉儲數據

$php = fopen(__FILE__, 'rb'); 
$tmp = fopen('php://temp', 'r+b'); 
fseek($php, __COMPILER_HALT_OFFSET__); 
stream_copy_to_stream($php, $tmp); 

我的問題帶有努力現已開放php://tempzip_open()

$zip = zip_open('php://temp'); 

從我所看到的(儘管其他類似的POSS由於缺少流支持,因此zip_open())這裏的問題是句柄之間的數據流php://memoryphp://temp內在的固有非永久性。如果這可以解決,也許它實際上是可能的。

它保持踢回錯誤碼11,我已發現上沒有 文檔(貌似,像大多數其他可能的錯誤代碼

var_dump($zip); // int(11) 

正如@cweiske指出的,錯誤代碼11 = ZipArchive::ER_OPEN,無法打開文件

這對我嘗試使用php://temp流或其他可能的問題有何影響?我也知道存在OOP方法(ZipArchive,等人),但我想我會從基礎開始。

任何想法?

+0

Alrighty,所以錯誤代碼** 11 **是一個**錯誤打開**根據http://www.php.net/manual/en/function.ziparchive-open.php#102849關於'ZipArchive '班。我會假設這轉換爲類將是一個包裝到相同的擴展功能。 – Dan

+0

當試圖解壓存儲在'c:\ windows \ temp'中的文件時,先前鏈接的註釋還提到了在不同的Windows操作系統上返回的所述錯誤當我嘗試使用可以轉儲到的'php:// temp'流一個文件,當數據長度超過上限時,它不會在那裏,反正我切換到'php:// memory',仍然導致**錯誤打開**。 – Dan

+0

謝謝@Gordon - *編輯*;不寫,只實際閱讀。 – Dan

回答

2

11是恆定ZIPARCHIVE::ER_OPEN,其手動與

描述無法打開文件

注意,手動這是否流包裝狀態可以被使用。


請考慮使用PHP的藥業擴展 - 它你想要做什麼,並且已經進行了測試。

+0

謝謝@cweiske - 我知道** phar **,但是這更多的是學術調查,更多地瞭解流和檔案支持。如果沒有明確提及在這種情況下可以使用流封裝,我們可以安全地認爲這是不可能的嗎?我想它肯定就是這樣。我是否應該進一步假設PHP以任何方式從內存中處理ZIP歸檔二進制數據時幾乎沒有(* read,no *)支持?使用臨時文件進行中間轉儲實際上很好,但我仍然對在內存中嚴格工作感到好奇。 – Dan

+0

我也發現通過重新打開'php:// temp'流來刷新現有內容。無論'zip_open()'是否支持流包裝器,這肯定會成爲一個問題,因爲我正在有效地傳遞一個空緩衝區,並且我無法將現有的流資源句柄傳遞給'zip_open()' – Dan