2

私のデータベースとサービングデータベースを備えた処理サーバーがあり、低帯域幅コストでファイルを提供しています。処理サーバーでは、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で転送できるようにします。これはまさに私が望むものですが、データを送信する前にデータを圧縮したい場合もあります。できれば、ziparchiveなどのphpのネイティブ部分のみを使用し、特別なストリーム操作用の追加のカスタムクラスは使用しないでください。私は次のことに非常に近いことを知っています...

$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」でファイルを作成するのに問題がないようですが、ZipArchiveがどのようにzipを作成するかを十分に理解していないのに、何らかの理由でgetStreamが失敗します...

文字列から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を返します。これにより、zipを「php://memory」に開くことができるかどうか疑問に思います。誰かが私がzipを取得するためにこれらの線に沿って何を試すことができるか知っていますか?

4

3 に答える 3

2

$zip->getStream('test')'test'アーカイブからファイルを抽出するためのストリームを取得しています。'test'アーカイブにファイルがないため、これは失敗します。これはあなたが使いたい機能ではありません。

あなたが言ったように、あなたがしたいことは、完成したアーカイブをftpサーバーに送ることです。この場合、zipアーカイブを閉じてからphp://memory、通常のファイルとして(を使用してfopen)再度開いて送信します。

$zipわかりませんが、ファイルを閉じて再度開くことなく、リソースとして直接使用できる場合もあります。

于 2012-07-15T02:08:29.177 に答える
2

そして、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.";
于 2012-07-15T03:00:25.280 に答える
1

Zipアーカイブである必要がありますか?bandwithを保存しようとしているので、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);
?>
于 2012-07-15T02:46:35.280 に答える