PHP provides ZipArchive Class which allows us to create a Zip file. This class makes file creation easier.
Programmatically Zip creation is mainly required when preparing the group of files and folders for downloading.
In the example, I am creating a function that will read all files and folders from the specified directory and add them to the ZipArchive class object.

Contents
1. HTML
Creating a <form> which have two button elements, one for Create Zip and another for Download.
Completed Code
<div class='container'>
<h2>Create and Download Zip file using PHP</h2>
<form method='post' action=''>
<input type='submit' name='create' value='Create Zip' />
<input type='submit' name='download' value='Download' />
</form>
</div>
2. PHP
I have created includes folder within the project where I stored some files and folders.
Create Zip
Create ZipArchive Class object for Zip file creation. Define a function createZip() to read files and directory from the specified directory path.
If file
If the reading value is the file then add it to zip object using addFile() method.
If directory
If the value is a directory then create an empty directory and call createZip() function where pass the directory path.
Download Zip
Check if the zip file exists or not. If it exists then download and remove it from the server.
Completed Code
<?php
// Create ZIP file
if(isset($_POST['create'])){
$zip = new ZipArchive();
$filename = "./myzipfile.zip";
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit("cannot open <$filename>\n");
}
$dir = 'includes/';
// Create zip
createZip($zip,$dir);
$zip->close();
}
// Create zip
function createZip($zip,$dir){
if (is_dir($dir)){
if ($dh = opendir($dir)){
while (($file = readdir($dh)) !== false){
// If file
if (is_file($dir.$file)) {
if($file != '' && $file != '.' && $file != '..'){
$zip->addFile($dir.$file);
}
}else{
// If directory
if(is_dir($dir.$file) ){
if($file != '' && $file != '.' && $file != '..'){
// Add empty directory
$zip->addEmptyDir($dir.$file);
$folder = $dir.$file.'/';
// Read data of the folder
createZip($zip,$folder);
}
}
}
}
closedir($dh);
}
}
}
// Download Created Zip file
if(isset($_POST['download'])){
$filename = "myzipfile.zip";
if (file_exists($filename)) {
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Content-Length: ' . filesize($filename));
flush();
readfile($filename);
// delete file
unlink($filename);
}
}
?>
3. CSS
.container{
margin: 0 auto;
width: 50%;
text-align: center;
}
input[type=submit]{
border: 0px;
padding: 7px 15px;
font-size: 16px;
background-color: #00a1a1;
color: white;
font-weight: bold;
}
4. Demo
5. Conclusion
The above-defined function createZip() accepts the path of the directory as a parameter. It will read all files and folders from the path and add them to the zip file.
You can also use ZipArchive Class to unzip the Zip file.