PHP zip_open()和php://temp,can';我好像打不开
不确定这是否可能,但现在已经成为一场学术斗争 使用PHP zip_open()和php://temp,can';我好像打不开,php,stream,zip,Php,Stream,Zip,不确定这是否可能,但现在已经成为一场学术斗争 使用\uuuuu halt\u compiler()技巧在PHP文件中嵌入二进制数据,我成功地创建了一个自打开脚本,该脚本将fseek()转换为\uuuuuu compiler\uu halt\u OFFSET\uuuuu(不太难看到,因为手册中记录了这个精确的示例) 无论如何,在调用\uuu halt\u compiler() 我尝试将数据直接复制到php://tempstream,并且已成功完成(如果我revind()和passthru()临时流
\uuuuu halt\u compiler()
技巧在PHP文件中嵌入二进制数据,我成功地创建了一个自打开脚本,该脚本将fseek()
转换为\uuuuuu compiler\uu halt\u OFFSET\uuuuu
(不太难看到,因为手册中记录了这个精确的示例)
无论如何,在调用\uuu halt\u compiler()
我尝试将数据直接复制到php://temp
stream,并且已成功完成(如果我revind()
和passthru()
临时流句柄,它将转储数据)
我的问题是现在试图打开php://temp
1带zip\u open()
1从我所看到的情况来看(尽管存在其他可能性,如zip\u open()
缺乏流支持),这里的问题是php://memory
和php://temp
句柄之间的流。如果能解决这个问题,也许事实上是可能的
它不断地回溯错误代码11
,我发现没有2文档(似乎与大多数其他可能的错误代码一样)
2正如@cweiske指出的,错误代码11=ZipArchive::ER_OPEN
,无法打开文件
这是我尝试使用php://temp
stream,还是其他一些可能的问题?我也知道有一种面向对象的方法(ZipArchive
,等等),但我想我应该从基础开始
有什么想法吗?11是恒定的
ZIPARCHIVE::ER_OPEN
,手册对此进行了描述
无法打开文件
请注意,手册中没有说明可以使用流包装器
请考虑使用PHP的phar扩展-它做了您想要的事情,并且经过了很好的测试。好的,因此错误代码11是一个根据关于
ZipArchive
类打开的错误。我假设这个类是相同扩展功能的包装器。之前链接的注释还提到了在不同的Windows操作系统上返回的错误,尝试解压缩存储在c:\windows\temp
中的文件时,我的尝试使用了php://temp
stream,当数据长度超过上限时,它可以转储到一个文件中,它就不存在了,于是我切换到php://memory
无论如何,仍然会导致错误打开。谢谢@Gordon-Edited;不,不是写,实际上只是阅读。谢谢@cweiske-我知道phar,不过这更多的是一个学术调查,同时了解更多关于流和档案支持的信息。如果没有明确提到流包装器可以在这种情况下使用,我们可以安全地假设这是不可能的吗?我想确实是这样。我是否应该进一步假设PHP几乎不支持(读取,不支持)以任何方式处理内存中的ZIP归档二进制数据?实际上,将临时文件用于中间转储是可以的,但我仍然对严格在内存中工作感到好奇。我还发现,通过重新打开php://temp
stream,它刷新现有内容。无论zip\u open()
是否支持流包装器,这肯定是一个问题,因为我实际上是在传递一个空缓冲区,而我无法将现有的流资源句柄传递给zip\u open()
$php = fopen(__FILE__, 'rb');
$tmp = fopen('php://temp', 'r+b');
fseek($php, __COMPILER_HALT_OFFSET__);
stream_copy_to_stream($php, $tmp);
$zip = zip_open('php://temp');
var_dump($zip); // int(11)