私のデータベースとサービングデータベースを備えた処理サーバーがあり、低帯域幅コストでファイルを提供しています。処理サーバーでは、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を取得するためにこれらの線に沿って何を試すことができるか知っていますか?