- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当我尝试这样做时:
$phar = new PharData('./phar.tar', 0, null, Phar::TAR);
$phar->addEmptyDir('test');
file_put_contents('phar://./phar.tar/test/foo.txt', 'bar');
我收到以下错误:
Warning: file_put_contents(phar://./phar.tar/test/foo.txt): failed to open stream: Cannot create phar './phar.tar', file extension (or combination) not recognised or the directory does not exist
我可以使用 file_get_contents 但 shouldn't file_put_contents work too ?
为了让事情变得更奇怪,我尝试了@hakre 在他的评论中提出的想法,并且成功了!
$phar = new PharData('./phar.tar', 0, null, Phar::TAR);
$phar->addEmptyDir('test');
if (file_exists('./phar.phar') !== true)
{
symlink('./phar.tar', './phar.phar');
}
file_put_contents('phar://./phar.phar/test/foo.txt', 'bar');
var_dump(file_get_contents('phar://./phar.tar/test/foo.txt')); // string(3) "bar"
最佳答案
简介
我认为这基本上与您正在使用 Phar::TAR
文件这一事实有关,因为
file_put_contents("phar://./test.tar/foo.txt", "hello world");
^
|+---- Note this tar
返回
Warning: file_put_contents(phar://./test.tar/foo.txt): failed to open stream: Cannot create phar './test.tar', file extension (or combination) not recognized or the directory does not exist
同时
file_put_contents("phar://./test.phar/foo.txt", "hello world"); // Works file
^
|+---- Note This phar
返回
//No Errors
了解问题
如果你看一个 detail example在 PHP 文档中,这是过去 2 年
中的一个已知问题,给出的示例如下
例子
$p = new PharData(dirname(__FILE__) . '/phartest.zip', 0, 'phartest', Phar::ZIP);
$p->addFromString('testfile.txt', 'this is just some test text');
// This works
echo file_get_contents('phar://phartest.zip/testfile.txt');
// This Fails
file_put_contents('phar://phartest.zip/testfile.txt', 'Thist is text for testfile.txt');
$context = stream_context_create(array(
'phar' => array(
'compress' => Phar::ZIP
)
));
// This Fails
file_put_contents('phar://phartest.zip/testfile.txt', 'Thist is text for testfile.txt', 0, $context);
// This works but only with 'r' readonly mode.
$f = fopen('phar://C:\\Inetpub\\wwwroot\\PACT\\test\\phartest.zip\\testfile.txt', 'r');
替代工作
不要使用.tar
或.zip
,您的文件有扩展名
,但要按照PHP DOC 中的说明设置压缩
我是什么意思?
$context = stream_context_create(array(
'phar' => array(
'compress' => Phar::GZ //set compression
)
));
file_put_contents('phar://sample.phar/somefile.txt', "Sample Data", 0, $context);
^
|= Use phar not tar
建议
我真的认为您应该坚持使用 PharData
是可以实现的,并且已经证明可以工作。唯一的办法是
我必须使用 file_put_contents
然后编写您自己的包装器并使用 stream_wrapper_register
注册它 这是一个简单的 Prof of Concept
stream_wrapper_register("alixphar", "AlixPhar");
file_put_contents('alixphar://phar.tar/test/foo.txt', 'hey');
^
|+-- Write with alixphar
echo file_get_contents('alixphar://phar.tar/test/foo.txt'),PHP_EOL;
echo file_get_contents('phar://phar.tar/test/foo.txt'),PHP_EOL;
输出
hey <----- alixphar
hey <----- phar
注意:此类不应在生产中使用...它只是一个示例,并且会导致某些测试用例失败
class AlixPhar {
private $pos;
private $stream;
private $types;
private $dir;
private $pharContainer, $pharType, $pharFile, $pharDir = null;
private $fp;
function __construct() {
$this->types = array(
"tar" => Phar::TAR,
"zip" => Phar::ZIP,
"phar" => Phar::PHAR
);
// your phar dir to help avoid using path before the phar file
$this->dir = __DIR__;
}
private function parsePath($path) {
$url = parse_url($path);
$this->pharContainer = $url['host'];
$this->pharType = $this->types[pathinfo($this->pharContainer, PATHINFO_EXTENSION)];
if (strpos($url['path'], ".") !== false) {
list($this->pharDir, $this->pharFile, , ) = array_values(pathinfo($url['path']));
} else {
$this->pharDir = $url['path'];
}
}
public function stream_open($path, $mode, $options, &$opened_path) {
$this->parsePath($path);
$this->stream = new PharData($this->dir . "/" . $this->pharContainer, 0, null, $this->pharType);
if (! empty($this->pharDir))
$this->stream->addEmptyDir($this->pharDir);
if ($mode == "rb") {
$this->fp = fopen("phar://" . $this->pharContainer . "/" . $this->pharDir . "/" . $this->pharFile, $mode);
}
return true;
}
public function stream_write($data) {
$this->pos += strlen($data);
$this->stream->addFromString($this->pharDir . "/" . $this->pharFile, $data);
return $this->pos;
}
public function stream_read($count) {
return fread($this->fp, $count);
}
public function stream_tell() {
return ftell($this->fp);
}
public function stream_eof() {
return feof($this->fp);
}
public function stream_stat() {
return fstat($this->fp);
}
}
关于php - 使用 phar Stream 写入 PharData 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14102585/
我实际上使用 wamp 2.5 和 PHP 5.5.12,当我尝试创建一个 时制药文件它返回给我以下消息: Uncaught exception 'UnexpectedValueException'
我正在尝试创建一个带有可执行 stub 的 PHAR 存档。代码: buildFromDirectory('files/'); $phar->setStub($phar->createDefaultS
我将我的 phar 添加到 cache_list php.ini 中的指令和缓存效果很好。几天后我更新了 phar 现在我收到以下错误: Warning: Phar::webPhar(phar:///
首先要做的是:我的 Phars 确实在运行。我正在玩一点,我有以下场景: 应用程序的 Phar(没有任何不规则之处)(application-phar) 第二个 phar,例如用于图书馆。 (lib-
我已将 PHP 应用程序打包到可执行的 Phar 存档 中,并在一个类中放置了一个方法,该方法应访问已执行的 Phar 存档 元数据。 我可以获得如下所示的元数据,但是我在执行的 Phar archi
我正在使用 PHP 构建系统 phing 创建一个 phar 归档文件。 是否有任何已知的科学可以让我自动将 phar.readonly 设置为 0(这将允许创建 phar 到知道)在 phing 运
我正在尝试创建一个 php 可执行文件(一个 phar 文件)来生成一些文件,我想知道如何获取 phar 文件的真实路径(在 phar 文件代码中)。 我想做的是在phar文件的同一级别创建一个文件夹
前言 最近因为工作需要要使用PHP 7,所以从网上找教程进行安装, 结果编译没问题, 安装的时候报了错误。 错误如下 ?
后 composer install PhpStorm 开始索引并卡在“扫描库 PHARS”上。 几个小时后它没有完成。 最佳答案 您可以将 *.phar 添加到 Settings -> Editor
我正在考虑构建我们的 php 应用程序的部署过程,以便构建的输出为在生产中运行应用程序所需的代码生成单个 phar 存档。我想知道以这种方式部署 web 应用程序的性能与 check out 或将源树
我在构建 php 应用程序时遇到问题。 此项目中不存在目标“构建” 在 netbeans php 项目中。 只需发送使用 ubuntu 操作系统在 netbeans IDE 中构建 Phar 和 Co
我将在 php 中启动一个新的门户应用程序,它将包含 5 7 个组件。几个月前我阅读了有关 php phar 的文章,想知道单独创建每个组件的 phar 并以某种方式使用它们是否对我有益。我即将启动该
我只是想知道将静态内容添加到 phar 文件(图像、javascript 或 html 文件)是否合法。如果是这样,我如何让他们为客户服务? 到目前为止我看到的唯一例子是: 但我想这不是一个好方法。
使用phar创建tar.gz压缩包返回一个奇怪的错误,错误信息如下: exception 'BadMethodCallException' with message 'Unable to add ne
我尝试使用 Silex 框架作为我的网络应用程序的基础。但是,如果我尝试包含 *.phar 存档,PHP 会抛出以下错误: Fatal error: Class 'Phar' not found in
我正在尝试使用 Symfony2 控制台库构建 CLI 工具。我有一些基本的工作,现在我想把它打包成 phar。我读过几个示例,但我看到的示例非常简单(3 个文件,没有命名空间等)。 在我的 src/
我需要将配置文件放在我的网络应用程序的 phar 之外。我需要安装它。在我的 stub 文件中我尝试过:
我在 Debian 上使用 PHP 5.3,并根据 php -m 加载“Phar”。 但是执行 php Pyrus.phar 或 php Pyrus.phar config-show 根本不会产生任何
向 Phar 专家提问 假设我有 3 个 php 文件,在每个文件中我打开一个 mysql 连接并执行一些操作。 如果我将这 3 页压缩到一个 Phar 文件中,mysql 连接是否在整个 Phar
我正在尝试安装 composer,但是我无法理解这一行,我需要做什么?我已经尝试转到 github token 设置,但我实际上需要生成哪个 token ?有没有人在安装的时候遇到类似的问题?
我是一名优秀的程序员,十分优秀!