Home > PHP

ZIPの圧縮・展開をPHPで

 PHPはいいですね。zipの圧縮と展開まで自動的にやってくれる。私のサーバー環境では何も設定しなくてもできてしまいましたが、PHP 5 >= 5.2.0, PECL zip >= 1.1.0ということでPHP5の拡張モジュール「PECL」のインストールがしていない場合は使えないと思います。PHPのかなり詳しいサイトhttp://www.php.net/にもインストール方法が載っているので参考にしてください。

Zipファイルを展開する

 xxx.zipというアーカイブをxxxという通常のフォルダーに展開します。
<?

$archive_path = "xxx.zip"; # 展開するアーカイブのパス
$opend_file = "xxx";# 展開されるアーカイブのパス

$zip = new ZipArchive; #(*1)
if ($zip->open("$archive_path") === TRUE) {
    $zip->extractTo("$opend_file"); #(*2)
    $zip->close();
    echo '成功';
} else {
    echo '失敗';
}

?>
 まずはZipArchiveクラスを初期化して呼び出します。(*1) openメソッド、extractToメソッド、closeメソッドを使ってzipフォルダーを展開するという感じです。実際にzipを展開するのはextractToメソッド(*2)です。オブジェクトに慣れてないと何だかあんまり馴染まないですが、慣れてくると便利です。
 アーカイブの中身の単一のファイルのみも展開できるので、PHP: ZipArchive::extractToを参考にしてください。

zipで圧縮する

 いろいろ迷いましたがPHPとは関係なくshellのコマンドを使った方が早いことがわかりました。この例ではクラスもメソッドも必要ないです。shellのzipコマンドで圧縮するフォルダ(ディレクトリ)と圧縮後のファイル名を指定すればよいだけです。PHP内でshellを使う場合は、system関数を利用します。
<?

$file = "test";# 圧縮するファイルパス(フォルダーパス)
$archive_zip_dir = "test.zip"; # 圧縮後のファイルパス(ファイル名)

$re = system("zip -r $archive_zip_dir $file");
print $re."<br />\n";

?>
 注意点はshellのzipコマンドのパスが感覚的に「zip <zip圧縮するフォルダ> <圧縮後のフォルダ>」と思いますが、そこのところが逆でして、「zip <圧縮後のフォルダ> <zip圧縮するフォルダ>」となっていることです。しばらく気がつきませんでしたよ。
 またsystem()は自動的にshellのメッセージを出力してしまうようなので、shell_exec()を使うと出力文字列を制御できますのでエラールーチンなんかを作ることができると思います。






プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer