PHPでZipファイルを作成・展開する方法を初心者向けに解説!ZipArchiveクラスを使った圧縮・解凍の基本
生徒
「PHPで複数のファイルをまとめて1つのZipファイルにするにはどうしたらいいですか?」
先生
「PHPにはZipArchiveというクラスがあって、ファイルを圧縮したり、Zipファイルを解凍したりできますよ。」
生徒
「圧縮って何ですか?解凍ってどういう意味ですか?」
先生
「圧縮とは、複数のファイルやフォルダを1つにまとめてサイズを小さくすることです。反対に、解凍とはZipファイルから元のファイルを取り出すことですね。実際に使い方を見ていきましょう!」
1. Zipファイルとは?初心者向けに簡単に説明
Zip(ジップ)ファイルとは、複数のファイルやフォルダを1つにまとめて、さらにデータサイズを小さく(圧縮)できる便利なファイル形式のことです。拡張子は「.zip」となります。WindowsやMacなどのOSを問わず、世界中で最も一般的に使われているアーカイブ形式です。
日常生活で例えるなら、「旅行のパッキング」をイメージすると分かりやすいでしょう。バラバラな服(ファイル)をそのまま運ぶのは大変ですが、圧縮袋に入れて空気を抜き、スーツケース(Zipファイル)にまとめれば、持ち運びが楽になり、場所も取りません。これと同じことがパソコンの世界でも行われています。
Zipファイルにする3つのメリット
- データ容量の節約: 写真や文書を圧縮して、ストレージの空きを増やせる。
- 転送時間の短縮: サイズが小さくなるため、メール送信やダウンロードが速くなる。
- 管理が楽: 100枚の画像も「1つのファイル」として扱えるので、送り忘れを防げる。
また、Zipファイルは中身を見るために「展開(解凍)」という作業が必要です。鍵のかかった箱を開けて、中の荷物を取り出すようなイメージですね。PHPを使えば、この「箱を作る(圧縮)」作業や「箱を開ける(解凍)」作業を自動化することができます。
2. PHPのZipArchiveとは?初心者でも手軽に使える標準機能
PHPでZipファイルを扱うための中心的な役割を果たすのが、「ZipArchive(ジップアーカイブ)」というクラス(機能のセット)です。これはPHPの標準機能として組み込まれているため、特別な外部ソフトをインストールしなくても、プログラムから直接Zipの作成や展開が可能です。
プログラミング未経験の方にとって「クラス」という言葉は難しく感じるかもしれませんが、「Zipファイルを操作するための専用道具箱」だとイメージしてください。この道具箱の中には、「新しいZipを作る」「中身を見る」「ファイルを取り出す」といった便利な道具(メソッド)が最初から揃っています。
活用シーンの例:
- 大量の画像ファイルを1つにまとめてユーザーにダウンロードさせる
- サーバー上のログファイルを圧縮して保存容量を節約する
- アップロードされたZipファイルを自動で解凍して中身をチェックする
まずは、この「道具箱」を準備する(インスタンス化する)ための、最もシンプルな書き方を見てみましょう。
<?php
// 1. Zip操作のための「道具箱」を準備する
$zip = new ZipArchive();
// 2. この$zipという変数を使って、以降の圧縮・解凍作業を行っていきます
// ※まだ準備をしただけなので、実際のファイル操作はここから始まります
?>
このように、new ZipArchive()と記述するだけで、PHPでZipを自由自在に操る準備が整います。一見難しそうに見える自動圧縮システムも、実はこの一行からスタートするのです。それでは、具体的な使い方のステップを確認していきましょう。
3. PHPでZipファイルを作成する方法(基本)
PHPでZipファイルを作成する手順は、実は非常にシンプルです。「空の箱(Zipファイル)を用意して、そこに中身(ファイル)を一つずつ詰め、最後に蓋を閉める」という3ステップで考えれば、プログラミングが初めての方でもスムーズに理解できます。
以下のサンプルコードは、カレントディレクトリ(実行ファイルと同じ場所)にある2つのテキストファイルを1つのZipにまとめる、最も標準的な書き方です。
<?php
// 1. ZipArchiveのインスタンス(道具箱)を作成
$zip = new ZipArchive();
// 2. 作成するZipファイル名を指定
$zipFileName = 'sample.zip';
// 3. Zipファイルを開く(または新規作成する)
// ZipArchive::CREATE は「ファイルがなければ作る」という命令です
if ($zip->open($zipFileName, ZipArchive::CREATE) === TRUE) {
// 4. Zipの中にファイルを追加する
// addFile('実際のファイル名', 'Zip内での名前') と指定できます
$zip->addFile('file1.txt');
$zip->addFile('file2.txt');
// 5. 最後に必ず close() で保存・確定させる
$zip->close();
echo '成功:Zipファイルが正しく作成されました!';
} else {
echo '失敗:Zipファイルの作成ができませんでした。';
}
?>
コードの重要ポイント解説
- openメソッド: 第2引数に
ZipArchive::CREATEを指定することで、新しいZipファイルを生成します。これがないと、既存のファイルを探しに行ってしまいエラーになることがあります。 - addFileメソッド: この関数を呼ぶたびに、Zipの中にファイルが1つずつ追加されます。実在しないファイル名を指定すると失敗するため、事前にファイルの存在を確認するのがベストです。
- closeメソッド: 一番重要です! この関数を呼び出したタイミングで初めてファイルが書き込まれます。書き忘れに注意しましょう。
この基本パターンを覚えれば、WebサイトからPDF資料をまとめてダウンロードさせたり、バックアップファイルを自動生成したりといった、便利な機能を簡単に実装できるようになります。
4. Zipファイルにフォルダごと追加・圧縮する方法
実際のWeb開発では、1つのファイルだけでなく「特定のフォルダ(ディレクトリ)を丸ごとZipにまとめたい」という場面が非常に多いです。しかし、PHPのZipArchiveには、残念ながら「フォルダ名を指定するだけで中身を全部入れる」という専用の魔法のようなボタンはありません。
そのため、「フォルダの中にあるファイルを1つずつ取り出して、順番にZipの箱に詰めていく」という作業をループ(繰り返し処理)で行う必要があります。初心者の方でも分かりやすい、最もシンプルで汎用的なコード例を見てみましょう。
<?php
// 1. 保存先のZipファイル名
$zipFileName = 'archive_folder.zip';
// 2. 圧縮したいフォルダ名
$targetDir = 'my_photos';
$zip = new ZipArchive();
// Zipファイルを作成・オープン
if ($zip->open($zipFileName, ZipArchive::CREATE) === TRUE) {
// 指定したフォルダ内のファイル一覧を取得
$files = scandir($targetDir);
foreach ($files as $file) {
// 「.(現在の階層)」と「..(親階層)」は除外して、本物のファイルだけを処理
if ($file !== '.' && $file !== '..') {
// 第1引数:実際のファイルの場所
// 第2引数:Zip内での保存名(フォルダ構造を維持するためにパスを含める)
$zip->addFile($targetDir . '/' . $file, $file);
}
}
$zip->close();
echo 'フォルダの圧縮に成功しました!';
} else {
echo 'エラー:フォルダの読み込みに失敗しました。';
}
?>
初心者が押さえておくべきポイント
- scandir関数: フォルダの中身をのぞき見するための関数です。これにより、中身が何個あっても自動でリストアップできます。
- 「.」と「..」の除外: パソコンの仕組み上、どんなフォルダにもこの2つの「隠れた記号」が存在します。これらをZipに入れようとするとエラーや不具合の原因になるため、
if文で必ず除外するのが定石です。 - ファイルパスの指定:
addFileを使うときは、「サーバー上のどこにファイルがあるか」を正しく教える必要があります。$targetDir . '/' . $fileのように、フォルダ名とファイル名をスラッシュでつなぐのがコツです。
この仕組みを応用すれば、大量の画像アップロードや、月ごとのレポートフォルダのバックアップなども、ボタン一つで自動化できるようになります。まずは小規模なフォルダから試してみましょう。
5. PHPでZipファイルを展開(解凍)する方法:extractToの使い方
Zipファイルを作成する技術と同じくらい重要なのが、受け取ったZipファイルを解凍して中身を取り出す「展開(解凍)」の技術です。PHPを使えば、サーバー上にアップロードされた圧縮ファイルを自動で解凍し、特定のフォルダに展開する処理も数行のコードで実装できます。
初心者の方でも迷わないよう、最もシンプルに「sample.zip」というファイルを解凍するコード例を見てみましょう。あらかじめ「unzipped」という名前の空フォルダを作っておくとスムーズに動作します。
<?php
// 1. ZipArchiveのインスタンス(道具箱)を用意
$zip = new ZipArchive();
// 2. 解凍したいZipファイルを開く
// 第1引数には対象のファイル名を指定します
if ($zip->open('sample.zip') === TRUE) {
// 3. extractToメソッドで中身をすべて取り出す
// 引数には「解凍先のフォルダパス」を指定します
$zip->extractTo('unzipped/');
// 4. 作業が終わったら必ず閉じる
$zip->close();
echo '解凍が完了しました。「unzipped」フォルダを確認してください。';
} else {
// ファイルが見つからない場合や、壊れている場合はこちらが実行されます
echo 'エラー:Zipファイルを開けませんでした。';
}
?>
展開(解凍)を成功させるための重要解説
ここで登場した extractTo() は、Zipファイルの中身を丸ごと指定した場所へコピーする非常に強力なメソッドです。使う際のポイントは以下の2点です。
- 解凍先の指定:
'unzipped/'のように、最後にスラッシュ(/)を付けることで、そのフォルダの中に展開することを明示します。 - フォルダの権限: PHPがそのフォルダに新しいファイルを書き込める権限(パーミッション)を持っている必要があります。もしエラーが出る場合は、フォルダの書き込み設定を確認してみましょう。
この解凍処理をマスターすれば、例えば「ユーザーが投稿した複数の画像をZipで受け取り、自動で展開してギャラリーに表示する」といった高度なWebシステムへの第一歩を踏み出すことができます。
6. Zipファイルを扱うときの注意点
ZipファイルをPHPで扱うとき、以下のような点に気をつけましょう。
- ZipArchiveクラスが有効になっているか(PHPの設定)
- ファイルのパスが正しく指定されているか
- 書き込み権限のあるフォルダに保存しているか
- 解凍先のフォルダが存在するか、事前に作っておく
特に初心者の方は、ファイル名の打ち間違いやフォルダの場所を間違えやすいので、コピー&ペーストで入力するのが安心です。
7. 実際の用途や活用例
PHPのZipArchiveを使うと、以下のようなシステムが作れます。
- 写真や資料を一括ダウンロードできるWebアプリ
- ユーザーがアップロードしたファイルをまとめて保存
- 日付ごとに自動でバックアップを作成
とても便利なので、Web開発でよく使われる機能のひとつです。
まとめ
PHPでZipファイルを作成したり解凍したりする処理は、初心者にとって少し難しそうに見えますが、実際にはZipArchiveクラスを理解すると驚くほど扱いやすい機能であることがわかります。今回取り上げたZipファイルの圧縮と展開は、日常的に使われる作業であり、ウェブアプリケーションでも非常に活躍する重要な技術です。たとえば、複数の画像をまとめて保存したり、ユーザーがアップロードした複数ファイルをひとつのZipにまとめて配布する機能など、多くのシステムで応用が可能です。また、バックアップ処理として特定フォルダを自動でZip化して保存するなど、実務でも求められる操作が多く存在します。
ZipArchiveクラスは、ファイルを追加するaddFile()、Zipファイルを開くopen()、作成後に閉じるclose()など、直感的なメソッドで操作できる点も強みです。さらに、フォルダをまとめてZipに追加する場合はscandir()を活用することで、フォルダ内のファイルを一つずつ処理できます。Zipファイルを解凍したい場合にはextractTo()で指定場所に取り出せるため、データの整理や配布にも便利です。
こうした機能は、サーバー内のファイル管理を効率化するうえで欠かせないものであり、Web制作や業務システムの構築など、幅広い場面で活用されます。特に複数ファイルを小さなひとつのZipにまとめるという操作は、サーバーの負担軽減やユーザーの使いやすさ向上にもつながるため、覚えておくと役立つ場面がとても多いのです。以下のサンプルコードでは、Zipファイルの作成からフォルダ追加、解凍までの流れを一つのプログラムとしてまとめていますので、自分で試しながら理解を深める手助けにしてください。
サンプルプログラムまとめ
<?php
$zip = new ZipArchive();
$zipFile = "all.zip";
// Zipを開く(なければ作成)
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
// 単体ファイルの追加
$zip->addFile("file1.txt");
$zip->addFile("file2.txt");
// フォルダ内ファイルの追加
$folder = "docs/";
$files = scandir($folder);
foreach ($files as $f) {
if ($f !== "." && $f !== "..") {
$zip->addFile($folder . $f);
}
}
$zip->close();
echo "Zipファイルが完成しました。";
}
// 解凍処理
$unzip = new ZipArchive();
if ($unzip->open($zipFile) === TRUE) {
$unzip->extractTo("output/");
$unzip->close();
echo "解凍が完了しました。";
}
?>
このコードのようにZipArchiveを活用すると、ファイル追加から解凍までの一連の流れをシンプルな記述でまとめられます。初心者の方でも、実際に動かしてみることで圧縮処理の理解が深まり、より複雑な処理にも挑戦しやすくなります。Zipファイルは日常的にも頻繁に使われる形式なので、PHPから扱えるようになると、開発の幅が大きく広がります。
生徒
「ZipArchiveって名前だけ見ると難しそうでしたけど、実際はメソッドがわかりやすくて扱いやすいんですね。特にaddFileでどんどん追加できるのが便利だと思いました!」
先生
「そのとおりですね。ZipArchiveはPHPの中でも特に実用性が高い機能で、複数ファイルを効率よく扱うときにとても助けになります。解凍のextractToも覚えておくと作業の幅が広がりますよ。」
生徒
「フォルダをscandirで読み込んでZipに入れる方法もよくわかりました。写真のまとめやバックアップにも使えそうです!」
先生
「良い視点ですね。実務でもフォルダ全体をZip化して保存する処理はよく使われるので、今日の内容は今後とても役立つはずです。」
生徒
「ありがとうございます!自分でもいろいろ試して、もっと複雑なZip操作にも挑戦してみたいです。」