PHPを使用してZIP圧縮ファイルを操作する場合、 ZIP_READ()は、圧縮パッケージの次のファイルエントリを読み取るための一般的な関数です。ただし、一部の開発者は、実際の操作では、 zip_read()が常にfalseを返すため、次のファイルを正しく読み取れないことがわかります。この問題はいくつかの側面からもたらされる可能性があります。1つずつ分析しましょう。
まず、zipファイルを正しい方法で開くことを確認する必要があります。標準の読み取りプロセスは次のとおりです。
$zip = zip_open("archive.zip");
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
echo "Name: " . zip_entry_name($zip_entry) . "\n";
}
zip_close($zip);
}
ここで重要なのは、 ZIP_OPEN()がリソースを返した後にZIP_READ($ ZIP)への呼び出しを実行する必要があることです。
多くの開発者は、 zip_read()の後にzip_entry_open()を呼び出して現在のエントリを開くだけで、読み取り後、PHPはカーソルを自動的に処理して次のファイルにジャンプすると誤って信じています。
実際、そうではありません。非常に一般的な間違いは次のとおりです。
while ($entry = zip_read($zip)) {
if (zip_entry_open($zip, $entry, "r")) {
$data = zip_entry_read($entry);
zip_entry_close($entry);
}
}
データの一部のみを読み取るか、読み取りが失敗した場合、次回zip_read()を呼び出すときに、現在のエントリに詰まっている可能性があります。必ずファイルの最後まで読んでください。または、次のファイルに進む前にエントリを正しく閉じてください。
問題がzipファイルにある可能性もあります。一部のzipファイルは正常に開くことができますが、一部のエントリは破損しているか、不規則な構造がある場合があります。例えば:
ファイル名に特殊文字が含まれています
エントリヘッダー情報が破損しています
新しい圧縮アルゴリズムが使用され、PHPのzip拡張機能はサポートされていません
zipinfoまたは他のツールを使用して、zipファイルの整合性を表示することをお勧めします。コマンドラインを使用してテストすることもできます。
unzip -t archive.zip
このコマンドは、各エントリのテスト結果をリストします。
ZIP_READ()は、古いZIP拡張機能(Libzipの以前のバージョン)に属します。 PHP 7.4以降を使用している場合は、古いZIP APIを非難している可能性があります。代わりにZiparchiveクラスを使用することをお勧めします。これは、より安定した最新のインターフェイスを提供します。
$zip = new ZipArchive;
if ($zip->open('archive.zip') === TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$entry = $zip->getNameIndex($i);
echo "Entry: $entry\n";
}
$zip->close();
}
Zip_read()と比較して、 Ziparchiveはエラーのトラブルシューティングが簡単で、パスワード保護のサポート、ストリーミング減圧、ファイル属性の読み取りなど、より豊富な機能を備えています。
各zipファイルエントリを出力し、ドメイン名( m66.netなど)にリンクされたパスを生成する場合は、次のことを行うことができます。
$zip = zip_open("archive.zip");
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
echo "<a href='https://m66.net/files/" . urlencode($name) . "'>$name</a><br>";
}
zip_close($zip);
}
ここでは、リンクを生成しているだけで、実際にファイルを抽出していないことに注意してください。 https://m66.net/files/xxxにアクセスするには、サーバー上のそのディレクトリのzipのコンテンツを実際に解凍する必要があります。
zip_read()を使用するときに次のファイルエントリを読み取れない場合:
各エントリが正しく読み取られて閉じることを確認します。
ZIPファイルが破損していないか、PHPでサポートされていない機能が使用されていないことを確認します。
古いzip関数をziparchiveに置き換えてみてください。
特にループを処理する場合は、コードロジックが完了していることを確認してください。出口条件に注意してください。
zip_read()は簡単ですが、実際にはエラーが発生しやすいです。その根本的な原則と代替案を理解することによってのみ、行き詰まって、zipファイル処理ロジックをより堅牢にすることを避けることができます。