あなたのコードを私の 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 にすることができると明示的に述べていないことも事実です。