Home > Article > Backend Development > How to Stream Zip Files Dynamically on a LAMP Stack Without Creating Temporary Files?
How to Stream Zip Files Dynamically on a LAMP Stack
The Challenge
Creating archives of large files on-the-fly in a web service can lead to performance issues and resource constraints. Traditional methods involve creating temporary zip files, resulting in CPU, disk, and memory overhead.
Streaming Solution with popen() and flush()
To avoid these drawbacks, consider streaming the zip file creation directly to the user. This can be achieved using popen() or proc_open() to execute a streaming pipeline command (e.g., zip). Combining this with flush() allows for efficient streaming of the zip file as it is being created.
Revised Example
Here's an updated code example that addresses some caveats raised by @Benji in the comments:
<?php // Set headers header('Content-Type: application/octet-stream'); header('Content-disposition: attachment; filename="file.zip"'); mb_http_output('pass'); // Execute pipeline command using popen() $fp = popen('zip -r - file1 file2 file3', 'r'); // Initialize buffer $bufsize = 8192; // Stream zip file while (!feof($fp)) { $buff = fread($fp, $bufsize); echo $buff; } // Close process pclose($fp);
Note: While flush() was initially recommended, it's advisable to avoid using it within the loop for large files or slow networks. This can lead to buffer overrun issues.
Additional Considerations
For multi-processor servers, consider using nodeJS with the http and child_process modules for efficient, non-blocking I/O.
Setting the Content-Length header is not possible in this scenario as the zip file size is unknown beforehand. However, consider investigating if there are headers that indicate streaming or unknown content length.
The above is the detailed content of How to Stream Zip Files Dynamically on a LAMP Stack Without Creating Temporary Files?. For more information, please follow other related articles on the PHP Chinese website!