我有一个带有我的数据库的处理服务器和一个服务数据库,以低带宽成本提供文件。在处理服务器上,php 无法创建文件,因此在发送到另一台服务器进行下载之前,必须使用流完成所有操作和/或保留在内存中。几天前,我发现了关于 'php://memory' 的流抽象,我可以做类似的事情
$fp=fopen('php://memory','w+');
fwrite($fp,"Hello world");
fseek($fp,0,SEEK_SET);
//make a ftp connection here with $conn_id
$upload = ftp_fput($conn_id,"targetpath/helloworld.txt",$fp,FTP_BINARY);
在内存中制作文件,然后允许我将其通过 ftp 传输到我的另一台服务器。这正是我想要的,除了我还想在发送数据之前压缩数据——最好只使用 php 的本机部分,如 ziparchive,而不是额外的自定义类来进行特殊的流操作。我知道我与以下内容非常接近...
$zip = new ZipArchive();
if($zip->open('php://memory', ZIPARCHIVE::CREATE)) {
$zip->addFromString('testtext.txt','Hello World!');
$fp = $zip->getStream('test'); if(!$fp) print "no filepointer";
//make a ftp connection here with $conn_id
$upload = ftp_fput($conn_id,"targetpath/helloworld.zip",$fp,FTP_BINARY);
} else print "couldn't open a zip like that";
失败的地方是对 getStream 的调用(尽管我认为我使用正确,但它总是返回 false)。似乎 zip 可以很好地在 'php://memory' 中制作文件,但由于某种原因 getStream 仍然失败,尽管我可能不太了解 ZipArchive 是如何制作 zip 的......
如何从字符串转到压缩文件指针,以便将 zip 文件通过 ftp 传输到其他服务器?请记住,我不能制作任何文件,否则我只会制作 zip 文件,然后将其 ftp 传输过来。
编辑:根据下面skinnynerd的建议,我尝试了以下
$zip = new ZipArchive();
if($zip->open('php://memory', ZIPARCHIVE::CREATE)) {
$zip->addFromString('testtext.txt','Hello World!');
$zip->close();
$fp = fopen('php://memory','r+');
fseek($fp,0,SEEK_SET);
//connect to ftp
$upload = ftp_fput($conn_id,"upload/transfer/helloworld.zip",$fp,FTP_BINARY);
}
这确实会创建一个 zip 并将其发送过去,但 zip 的大小为 0 字节,因此我认为 'php://memory' 的工作方式与我想象的不同……它实际上在最后一步失败了——$zip ->close() 返回 false,这让我想知道我是否可以将 zips 打开到 'php://memory' 中。有谁知道我可以沿着这条线尝试什么来获得拉链?