gpt4 book ai didi

php - 如何将phar文件放入phar文件中?

转载 作者:行者123 更新时间:2023-12-02 07:33:43 25 4
gpt4 key购买 nike

我想将 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例如

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

将使 phar 文件 test2.phar 被加载并通过别名 test2 访问,因此您可以通过执行以下操作包含其中的文件:

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 文件的 stub 文件似乎存在一些含糊之处(也就是我不明白)。即它们是否都被加载,或者只是最外层的 phar 文件加载并运行其 stub 。

关于php - 如何将phar文件放入phar文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13180438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com