【PHP入門】完全保存版!ZipArchiveを使ったファイル圧縮・解凍方法

こんにちは!エンジニアのオータケです。

PHPで「データをひとまとめにしてユーザーにダウンロードしてもらいたい」、「圧縮済みのデータを解凍して中身のデータを使いたい!」といったことがあるかと思います。

今回の記事ではZipArchive、gzcompress、gzuncompressといった圧縮・解凍がテーマです!

本記事を読むことで

・ZipArchiveでファイルを圧縮
・ZipArchiveでファイルを展開

といったZipArchiveの使い方から

・gzcompressを使った文字列の圧縮
・gzuncompressを使った文字列の解凍

といった文字列に関しての圧縮・解凍についても解説していきます。

この記事を見て圧縮・解凍に関して学んでみましょう!

目次

PHPでファイルや文字列を圧縮・解凍(展開)するには?

PHPでファイルや文字列を圧縮したいと思ったことはありませんか?

PHPでは様々な関数やクラス・ライブラリが用意されており、ファイルをZIPファイル形式で圧縮した場合はZipArchiveという機能を使うことで実現することができます。

また、文字列を圧縮したいと思った場合はgzcompress、解凍した場合はgzuncompressを使うことで実現することができます。

データの圧縮方法にはいくつか種類があり、上記の場合で言えば前者はzip形式で後者はgzip形式での圧縮方法になります。

今回はこの2つを扱っていきたいと思います。
次の章ではまずzip形式でデータの圧縮・解凍を行うZipArchiveについて扱っていきたいと思います!

ZipArchiveを使ってみよう

事前準備

ZipArchiveを使うためにはPHPにzipを扱うためのライブラリが入っている必要があります。
これがないとZipArchive自体が使えません。

その機能が入っているかどうか調べるためには次のようなコマンドを入力して実行します。
(Windowsであればコマンドプロンプト、LinuxやMacであればターミナルになります。)

php -r phpinfo();

もし、コマンドを実行して正しく実行できなかった場合はPHPが正しくインストールされているかどうか確認してみてください

わからないという方は次の記事が参考になりますよ!

さて本題に戻ります。
phpinfoを使って今インストール済みのPHPでどんな機能がつかえるか表示します。

この中でにzipという項目があり、「Zip => enabled」があればZipArchiveを使うことが可能です!

php_ziparchive_1

phpinfoの使い方でつまづいてしまった場合は次の記事を見てみましょう!

とても丁寧な解説でphpinfoの使い方についてもわかってもらえるかと思います!

圧縮

まずは圧縮について見てみましょう。

圧縮したいファイルsample.txtを用意しておきます。
このファイルはこのあと提示するPHPサンプルのコードと同じディレクトリに置いておくことにします。

このsample.txtの中身は次のようにしておきます。
sample.txt

このテキストファイルが圧縮されます。

では次にサンプルコードを見てみましょう。

<?php

$compress_file = './sample.txt';
$file = './compress.zip';

// 圧縮・解凍するためのオブジェクト生成
$zip = new ZipArchive();

$result = $zip->open($file, ZipArchive::CREATE);
if($result === true)
{
  // 圧縮
  $zip->addFile($compress_file);

  // ファイルを生成
  $zip->close();
}
?>

このコードでは大きく分けて4つのことをしています。

それは、「ZipArchiveオブジェクトの生成」「ファイルを生成するための準備」「圧縮するファイルの追加」「ファイルの生成」です。

まず「ZipArchiveオブジェクトの生成」についてですが、この部分になります。

$zip = new ZipArchive();

ここではファイルを圧縮する機能を扱うためにZipArchiveクラスのインスタンスを生成し変数$zipに保持しています。

先程の項でもあったとおりインストールされているPHPの環境にzip関係の機能がインストールされていないとこの行で警告・エラーが出て圧縮できなくなってしまいます。

次に「ファイルを生成するための準備」ですが、

$result = $zip->open($file, ZipArchive::CREATE);

この部分になります。

このopenメソッドを使うことでzipファイルを作るための準備をします。

第一引数にはzipファイルの名前を決めます。
今回の場合はcompress.zipと書いているので圧縮後のファイル名はcompress.zipになります。

ここではパスも含めてしていできるため、どこか任意の場所に生成したい場合はパスも含めて書くと良いでしょう。

このopenメソッドですが実行に成功した場合はtrueが返されます。失敗した場合はエラーコードが返されるため返されたエラーコードによってなぜ失敗したのかを知ることができます。

エラーコードについては公式ドキュメントの戻り値をごらんください。

ZipArchive::open
http://php.net/manual/ja/ziparchive.open.php

次に「圧縮するファイルの追加」ですが

$zip->addFile($compress_file);

この部分です。

ここでは生成するzipファイルに対してファイルを追加することをしています。

引数には圧縮したい対象となるファイル名を指定しています。

今回は先程作ったtxtファイルであるsample.txtを指定しています。

最後に「ファイルの生成」ですが、

$zip->close();

closeメソッドを呼び出すことで準備やaddFileした設定をもとにzipファイルが生成されます。

これで圧縮についての解説はおわりです。
次に、この圧縮したファイルを解凍してみましょう。

解凍(展開)

この項では圧縮したファイルを展開します。

前項で作ったcompress.zipを解凍してみるサンプルを作ってみました。

<?php

$file = './compress.zip';

// 圧縮・解凍するためのオブジェクト生成
$zip = new ZipArchive();

$result = $zip->open($file);
if($result === true)
{
  $zip->extractTo('./');
  $zip->close();
}
?>

openメソッドとcloseメソッドは圧縮時にも使いました。

解凍時にはextractToメソッドを使ってファイルを解凍します。
引数にはファイルを展開するディレクトリを指定します。

解凍はこれだけでできます!

文字列を圧縮・解凍してみよう

圧縮

今度は文字列を圧縮してみましょう。
先程はZipArchiveを使ってファイルを圧縮・解凍していましたが今度はgzip形式で圧縮してみます。

<?php
$compress_str = gzcompress('Hello PHP World', 9);

echo $compress_str;
?>

こちらはZipArchiveクラスとは違い、gzcompress関数を使うだけです。

第一引数には圧縮したい文字列を指定します。

第二引数には圧縮レベルを指定します。

この引数では0~9を指定します。0は非圧縮、9は最大の圧縮レベルとなります。

圧縮レベルが高ければ高いほど圧縮後の文字列のサイズが小さくなります。

逆に、圧縮レベルが低ければ低いほど圧縮後の文字列のサイズは大きくなります。

解凍

先程のサンプルでは圧縮のみを取り扱う内容でした。

今回ではその圧縮した内容を解凍するサンプルコードを作っています。

<?php
$compress_str = gzcompress('Hello PHP World', 9);
$uncompress_str = gzuncompress($compress_str);

echo $compress_str;
echo $uncompress_str;
?>

文字列を解凍する場合は、gzuncompress関数を使うことで実現できます。

引数にはgzcompress圧縮した文字列を渡すことで解答することができます。

まとめ

いかがでしょうか?

今回はファイルを圧縮・解凍するZipArchiveクラスの使い方をご紹介しました。

また、文字列の圧縮・解凍するgzcompressgzuncompress関数についても触れました。

これらの機能を覚えて圧縮したいデータをどんどん圧縮していきましょう!

この記事を書いた人

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

目次