簡體   English   中英

如何將phar文件放在phar文件中?

[英]How to place a phar file inside a phar file?

我想將一個phar文件放在一個phar文件中。 我最直接地嘗試過:

$p = new Phar('test.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello world\n";';

$p = new Phar('test2.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello phar world\n";';
$p['test.phar'] = file_get_contents('test.phar');

但是PHP只是不想打開它。 它不接受以下任何一項包括:

// Warning: Phar::mapPhar(phar://path/to/test2.phar/test.phar): failed to open
// stream: Invalid argument in phar://path/to/test2.phar/test.phar
include('phar://test2.phar/test.phar');

// Warning: include(phar://test2.phar/test.phar/index.php): failed to open
// stream: phar error: "test.phar/index.php" is not a file in phar "test2.phar"
include('phar://test2.phar/test.phar/index.php');

// Warning: include(phar://test2.phar/phar://test.phar/index.php): failed to
// open stream: phar error: "phar:/test.phar/index.php" is not a file in phar
// "test2.phar"
include('phar://test2.phar/phar://test.phar/index.php');

我知道這個問題的建設性是有限的,因為它可能不適用於phar-in-phar但是我可能只是錯過了一種方法如何做到這一點而我只是沒有看到樹木的木材。

用於在PHP中加載phar文件的函數是Phar :: loadPhar eg

Phar::loadPhar("test2.phar", "test2");

是否可以通過別名test2加載和訪問phar文件test2.phar,因此您可以通過執行以下操作來包含文件:

include ('phar://test2/index.php');

但是,如果該文件位於phar本身內部,則似乎不起作用。 loadPhar的PHP代碼是:

fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK, &actual);

顯然IGNORE_URL標志使文件無法打開。

有一個解決方法 - 將另一個phar中包含的phar文件解壓縮到一個臨時文件,然后顯然可以毫無問題地加載它。 以下代碼將提取第二個phar文件中包含的phar文件(phar1.phar),然后調用loadPhar。

function extractAndLoadPhar(){

    $tempFilename =  tempnam( sys_get_temp_dir() , "phar");

    $readHandle = fopen("phar://phar2/phar1.phar", "r");
    $writeHandle =  fopen($tempFilename, "w");

    while (!feof($readHandle)) {
        $result = fread($readHandle, 512);
        fwrite($writeHandle, $result);
    }

    fclose($readHandle);
    fclose($writeHandle);

    $result = Phar::loadPhar($tempFilename, "phar1");
}

extractAndLoadPhar(); //Extract and load the phar
include ('phar://phar1/src1.php'); //It can now be referenced by 'phar1'

我已經在這里放置了這段代碼的工作副本https://github.com/Danack/pharphar ,它創建了一個phar,將它嵌入到第二個phar中,然后加載並調用第二個phar中第一個phar的函數。

要注意 - 我不相信這種技術是個好主意。 似乎有一些歧義(我不明白)每個phar文件的存根文件會發生什么。 即它們是否都被加載,或者它只是最外層的phar文件,它的存根被加載並運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM