4

ローカル ファイルから zip ファイルを作成し、直接 ftp にストリーミングしようとしています (最初に zip をディスクに書き込む必要はありません)。圧縮自体には問題はありませんが、ZipArchive クラスが ftp ストリーム ラッパーを認識していないようです。

次のコードは、問題を説明するために思いついた最も単純なものです

<?php

$zip = new ZipArchive();
var_dump($zip->open('ftp://[username]:[password]@[hostname.net]/public_html/test.zip', ZipArchive::OVERWRITE));

$zip->addFile(realpath('/input.txt'), 'input.txt');

var_dump($zip->close());

$zip->open呼び出しは戻りますがtrue、戻り$zip->closeますfalse。エラー メッセージを取得する方法や、there is an error. 問題は、私が何を間違っているのか、または ZipArchive クラスでこのようなことを行うことができないということです。

4

1 に答える 1

5

あなたのコードを私の Ubuntu システムでテストしましたが、動作しないことを確認できました。
「strace」ユーティリティを使用すると、以下に示すように、PHP が「$filename」引数をローカル ファイル名であるかのように処理していることがわかりました。

lstat64("/var/www/test/ftp://myuser:mypass@127.0.0.1/tmp/test.zip", 0xbfcbb008) = -1 ENOENT (No such file or directory)
lstat64("/var/www/test/ftp://myuser:mypass@127.0.0.1/tmp", 0xbfcbaeb8) = -1 ENOENT (No such file or directory)
lstat64("/var/www/test/ftp://myuser:mypass@127.0.0.1", 0xbfcbad68) = -1 ENOENT (No such file or directory)
lstat64("/var/www/test/ftp:", 0xbfcbac28) = -1 ENOENT (No such file or directory)

「/var/www/test」プレフィックスは、PHP テスト スクリプトのパスです。
したがって、事実上、ZipArchive::open() メソッドは URL ファイル名を処理できないようです。
PHP ソース コードを調べたところ、ZipArchive::open() メソッドが " zip_open " 関数を呼び出していることがわかりました。「 fopen」関数
の PHP マニュアル ページには、次のように記載されています。

filename が "scheme://..." の形式の場合、URL と見なされ、PHP はそのスキームのプロトコル ハンドラー (ラッパーとも呼ばれます) を検索します。そのプロトコルのラッパーが登録されていない場合、PHP は、スクリプト内の潜在的な問題を追跡するのに役立つ通知を発行し、filename が通常のファイルを指定しているかのように続行します。

「 stream_wrapper_register 」関数の PHP マニュアル ページにあるこの投稿では、zip_open() がカスタム ストリーム ラッパーを無視すると述べていますが、上記のテストでは、標準のストリーム ラッパーも無視されることが示されています。
また、ZipArchive::open() のマニュアル ページも zip_open のマニュアル ページも、「$filename」パラメータを URL にすることができると明示的に述べていないことも事実です。

于 2012-09-03T21:20:25.220 に答える