php中压缩流的字符串



我有一个带数据库的处理服务器和一个服务数据库,以低带宽成本提供文件。在处理服务器上,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的本地部分,如zipparchive,而不是用于特殊流操作的额外自定义类。我知道我非常接近以下。。。

$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的…"。。。

如何从字符串转到压缩文件指针,以便将压缩文件通过ftp传输到其他服务器?请记住,我不能制作任何文件,否则我只会制作zip文件,然后通过ftp进行传输。

编辑:根据Skinnerd下面的建议,我尝试了以下

$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,这让我怀疑是否可以打开zip-intophp://memory"。有人知道我可以沿着这条线试什么来拉拉链吗?

$zip->getStream('test')正在获取一个流以从存档中提取文件'test'。由于存档中没有文件'test',因此此操作失败。这不是您想要使用的函数。

正如您所说,您想要做的是将完成的存档发送到ftp服务器。在这种情况下,您可能希望关闭zip存档,然后将php://memory作为普通文件重新打开(使用fopen)以发送它

我不知道,但您也可以直接使用$zip作为资源,而无需关闭和重新打开文件。

我认为您可以尝试直接从ftp服务器创建流管道

<?php
    $zip = new ZipArchive();
    if($zip->open('ftp://user:password@ftp.host.com/upload/transfer/helloworld.zip', ZipArchive::CREATE)) 
    {
        $zip->addFromString('testtext.txt','Hello World!');                         
        $zip->close();
    } 
    else 
        print "couldn't open zip file on remote ftp host.";

它必须是Zip存档吗?既然你想节省带宽,它也可能是一个gzip。

<?php
 $ftp_credentials = "ftp://USER:PASSWORD@HOST/helloworld.gz";
 $gz = gzencode("Hello World!", 9);
 $options = array('ftp' => array('overwrite' => true));
 $stream_context = stream_context_create($options);
 file_put_contents($ftp_credentials, $gz, 0, $stream_context);
?>

相关内容

  • 没有找到相关文章

最新更新