Documentation

ZipStream
in package

Streamed, dynamically generated zip archives.

Usage

Streaming zip archives is a simple, three-step process:

  1. Create the zip stream:
$zip = new ZipStream(outputName: 'example.zip');
  1. Add one or more files to the archive:
// add first file
$zip->addFile(fileName: 'world.txt', data: 'Hello World');

// add second file
$zip->addFile(fileName: 'moon.txt', data: 'Hello Moon');
  1. Finish the zip stream:
$zip->finish();

You can also add an archive comment, add comments to individual files, and adjust the timestamp of files. See the API documentation for each method below for additional information.

Example

// create a new zip stream object
$zip = new ZipStream(outputName: 'some_files.zip');

// list of local files
$files = array('foo.txt', 'bar.jpg');

// read and add each file to the archive
foreach ($files as $path)
  $zip->addFileFromPath(fileName: $path, $path);

// write archive footer to stream
$zip->finish();

Table of Contents

Properties

$centralDirectoryRecords  : array<string|int, string>
$comment  : string
$contentDisposition  : string
$contentType  : string
$defaultCompressionMethod  : CompressionMethod
$defaultDeflateLevel  : int
$defaultEnableZeroHeader  : bool
$enableZip64  : bool
$flushOutput  : bool
$httpHeaderCallback  : Closure
$offset  : int
$operationMode  : OperationMode
$outputName  : string|null
$outputStream  : resource
$ready  : bool
$recordedSimulation  : array<string|int, File>
$sendHttpHeaders  : bool

Methods

__construct()  : self
Create a new ZipStream object.
addDirectory()  : void
Add a directory to the archive.
addFile()  : void
Add a file to the archive.
addFileFromCallback()  : void
Add a file based on a callback.
addFileFromPath()  : void
Add a file at path to the archive.
addFileFromPsr7Stream()  : void
Add an open stream to the archive.
addFileFromStream()  : void
Add an open stream (resource) to the archive.
executeSimulation()  : void
Executes a previously calculated simulation.
finish()  : int
Write zip footer to stream.
clear()  : void
Clear all internal variables. Note that the stream object is not usable after this.
normalizeStream()  : resource
recordSentBytes()  : void
Record sent bytes
send()  : void
Send string, sending HTTP headers if necessary.
sendHttpHeaders()  : void
Send HTTP headers for this stream.

Properties

$centralDirectoryRecords

private array<string|int, string> $centralDirectoryRecords = []

$comment read-only

private string $comment = ''

$contentDisposition read-only

private string $contentDisposition = 'attachment'

$contentType read-only

private string $contentType = 'application/x-zip'

$defaultDeflateLevel read-only

private int $defaultDeflateLevel = 6

$defaultEnableZeroHeader read-only

private bool $defaultEnableZeroHeader = true

$enableZip64 read-only

private bool $enableZip64 = true

$flushOutput

private bool $flushOutput = false

$httpHeaderCallback read-only

private Closure $httpHeaderCallback

$outputName read-only

private string|null $outputName = null

$outputStream

private resource $outputStream

$recordedSimulation

private array<string|int, File> $recordedSimulation = []

$sendHttpHeaders

private bool $sendHttpHeaders = true

Methods

__construct()

Create a new ZipStream object.

public __construct([OperationMode $operationMode = OperationMode::NORMAL ][, string $comment = '' ][, StreamInterface|resource|null $outputStream = null ][, CompressionMethod $defaultCompressionMethod = CompressionMethod::DEFLATE ][, int $defaultDeflateLevel = 6 ][, bool $enableZip64 = true ][, bool $defaultEnableZeroHeader = true ][, bool $sendHttpHeaders = true ][, Closure|null $httpHeaderCallback = null ][, string|null $outputName = null ][, string $contentDisposition = 'attachment' ][, string $contentType = 'application/x-zip' ][, bool $flushOutput = false ]) : self
Examples
// create a new zip file named 'foo.zip'
$zip = new ZipStream(outputName: 'foo.zip');

// create a new zip file named 'bar.zip' with a comment
$zip = new ZipStream(
  outputName: 'bar.zip',
  comment: 'this is a comment for the zip file.',
);
Parameters
$operationMode : OperationMode = OperationMode::NORMAL

The mode can be used to switch between NORMAL and SIMULATION_* modes. For details see the OperationMode documentation.

Default to NORMAL.

$comment : string = ''

Archive Level Comment

$outputStream : StreamInterface|resource|null = null

Override the output of the archive to a different target.

By default the archive is sent to STDOUT.

$defaultCompressionMethod : CompressionMethod = CompressionMethod::DEFLATE

How to handle file compression. Legal values are CompressionMethod::DEFLATE (the default), or CompressionMethod::STORE. STORE sends the file raw and is significantly faster, while DEFLATE compresses the file and is much, much slower.

$defaultDeflateLevel : int = 6

Default deflation level. Only relevant if compressionMethod is DEFLATE.

See details of deflate_init

$enableZip64 : bool = true

Enable Zip64 extension, supporting very large archives (any size > 4 GB or file count > 64k)

$defaultEnableZeroHeader : bool = true

Enable streaming files with single read.

When the zero header is set, the file is streamed into the output and the size & checksum are added at the end of the file. This is the fastest method and uses the least memory. Unfortunately not all ZIP clients fully support this and can lead to clients reporting the generated ZIP files as corrupted in combination with other circumstances. (Zip64 enabled, using UTF8 in comments / names etc.)

When the zero header is not set, the length & checksum need to be defined before the file is actually added. To prevent loading all the data into memory, the data has to be read twice. If the data which is added is not seekable, this call will fail.

$sendHttpHeaders : bool = true

Boolean indicating whether or not to send the HTTP headers for this file.

$httpHeaderCallback : Closure|null = null

The method called to send HTTP headers

$outputName : string|null = null

The name of the created archive.

Only relevant if $sendHttpHeaders = true.

$contentDisposition : string = 'attachment'

HTTP Content-Disposition

Only relevant if sendHttpHeaders = true.

$contentType : string = 'application/x-zip'

HTTP Content Type

Only relevant if sendHttpHeaders = true.

$flushOutput : bool = false

Enable flush after every write to output stream.

Return values
self

addDirectory()

Add a directory to the archive.

public addDirectory(string $fileName[, string $comment = '' ][, DateTimeInterface|null $lastModificationDateTime = null ]) : void
File Options

See addFileFromPsr7Stream()

Examples
// add a directory named 'world/'
$zip->addDirectory(fileName: 'world/');
Parameters
$fileName : string
$comment : string = ''
$lastModificationDateTime : DateTimeInterface|null = null

addFile()

Add a file to the archive.

public addFile(string $fileName, string $data[, string $comment = '' ][, CompressionMethod|null $compressionMethod = null ][, int|null $deflateLevel = null ][, DateTimeInterface|null $lastModificationDateTime = null ][, int|null $maxSize = null ][, int|null $exactSize = null ][, bool|null $enableZeroHeader = null ]) : void
File Options

See addFileFromPsr7Stream()

Examples
// add a file named 'world.txt'
$zip->addFile(fileName: 'world.txt', data: 'Hello World!');

// add a file named 'bar.jpg' with a comment and a last-modified
// time of two hours ago
$zip->addFile(
  fileName: 'bar.jpg',
  data: $data,
  comment: 'this is a comment about bar.jpg',
  lastModificationDateTime: new DateTime('2 hours ago'),
);
Parameters
$fileName : string
$data : string

contents of file

$comment : string = ''
$compressionMethod : CompressionMethod|null = null
$deflateLevel : int|null = null
$lastModificationDateTime : DateTimeInterface|null = null
$maxSize : int|null = null
$exactSize : int|null = null
$enableZeroHeader : bool|null = null

addFileFromCallback()

Add a file based on a callback.

public addFileFromCallback(string $fileName, Closure $callback[, string $comment = '' ][, CompressionMethod|null $compressionMethod = null ][, int|null $deflateLevel = null ][, DateTimeInterface|null $lastModificationDateTime = null ][, int|null $maxSize = null ][, int|null $exactSize = null ][, bool|null $enableZeroHeader = null ]) : void

This is useful when you want to simulate a lot of files without keeping all of the file handles open at the same time.

Examples
foreach($files as $name => $size) {
  $archive->addFileFromCallback(
    fileName: 'streamfile.txt',
    exactSize: $size,
    callback: function() use($name): Psr\Http\Message\StreamInterface {
      $response = download($name);
      return $response->getBody();
    }
  );
}
Parameters
$fileName : string

path of file in archive (including directory)

$callback : Closure
$comment : string = ''

ZIP comment for this file

$compressionMethod : CompressionMethod|null = null

Override defaultCompressionMethod

See __construct()

$deflateLevel : int|null = null

Override defaultDeflateLevel

See __construct()

$lastModificationDateTime : DateTimeInterface|null = null

Set last modification time of file.

Default: now

$maxSize : int|null = null

Only read maxSize bytes from file.

The file is considered done when either reaching EOF or the maxSize.

$exactSize : int|null = null

Read exactly exactSize bytes from file. If EOF is reached before reading exactSize bytes, an error will be thrown. The parameter allows for faster size calculations if the stream does not support fstat size or is slow and otherwise known beforehand.

$enableZeroHeader : bool|null = null

Override defaultEnableZeroHeader

See __construct()

Tags
psalm-param

Closure(): (resource|StreamInterface|string) $callback A callback to get the file contents in the shape of a PHP stream, a Psr StreamInterface implementation, or a string.

addFileFromPath()

Add a file at path to the archive.

public addFileFromPath(string $fileName, string $path[, string $comment = '' ][, CompressionMethod|null $compressionMethod = null ][, int|null $deflateLevel = null ][, DateTimeInterface|null $lastModificationDateTime = null ][, int|null $maxSize = null ][, int|null $exactSize = null ][, bool|null $enableZeroHeader = null ]) : void
File Options

See addFileFromPsr7Stream()

Examples
// add a file named 'foo.txt' from the local file '/tmp/foo.txt'
$zip->addFileFromPath(
  fileName: 'foo.txt',
  path: '/tmp/foo.txt',
);

// add a file named 'bigfile.rar' from the local file
// '/usr/share/bigfile.rar' with a comment and a last-modified
// time of two hours ago
$zip->addFileFromPath(
  fileName: 'bigfile.rar',
  path: '/usr/share/bigfile.rar',
  comment: 'this is a comment about bigfile.rar',
  lastModificationDateTime: new DateTime('2 hours ago'),
);
Parameters
$fileName : string
$path : string
$comment : string = ''
$compressionMethod : CompressionMethod|null = null
$deflateLevel : int|null = null
$lastModificationDateTime : DateTimeInterface|null = null
$maxSize : int|null = null
$exactSize : int|null = null
$enableZeroHeader : bool|null = null
Tags
throws
FileNotFoundException
throws
FileNotReadableException

addFileFromPsr7Stream()

Add an open stream to the archive.

public addFileFromPsr7Stream(string $fileName, StreamInterface $stream[, string $comment = '' ][, CompressionMethod|null $compressionMethod = null ][, int|null $deflateLevel = null ][, DateTimeInterface|null $lastModificationDateTime = null ][, int|null $maxSize = null ][, int|null $exactSize = null ][, bool|null $enableZeroHeader = null ]) : void
Examples
$stream = $response->getBody();
// add a file named 'streamfile.txt' from the content of the stream
$archive->addFileFromPsr7Stream(
  fileName: 'streamfile.txt',
  stream: $stream,
);
Parameters
$fileName : string

path of file in archive (including directory)

$stream : StreamInterface

contents of file as a stream resource

$comment : string = ''

ZIP comment for this file

$compressionMethod : CompressionMethod|null = null

Override defaultCompressionMethod

See __construct()

$deflateLevel : int|null = null

Override defaultDeflateLevel

See __construct()

$lastModificationDateTime : DateTimeInterface|null = null

Set last modification time of file.

Default: now

$maxSize : int|null = null

Only read maxSize bytes from file.

The file is considered done when either reaching EOF or the maxSize.

$exactSize : int|null = null

Read exactly exactSize bytes from file. If EOF is reached before reading exactSize bytes, an error will be thrown. The parameter allows for faster size calculations if the stream does not support fstat size or is slow and otherwise known beforehand.

$enableZeroHeader : bool|null = null

Override defaultEnableZeroHeader

See __construct()

addFileFromStream()

Add an open stream (resource) to the archive.

public addFileFromStream(string $fileName, resource $stream[, string $comment = '' ][, CompressionMethod|null $compressionMethod = null ][, int|null $deflateLevel = null ][, DateTimeInterface|null $lastModificationDateTime = null ][, int|null $maxSize = null ][, int|null $exactSize = null ][, bool|null $enableZeroHeader = null ]) : void
File Options

See addFileFromPsr7Stream()

Examples
// create a temporary file stream and write text to it
$filePointer = tmpfile();
fwrite($filePointer, 'The quick brown fox jumped over the lazy dog.');

// add a file named 'streamfile.txt' from the content of the stream
$archive->addFileFromStream(
  fileName: 'streamfile.txt',
  stream: $filePointer,
);
Parameters
$fileName : string
$stream : resource

contents of file as a stream resource

$comment : string = ''
$compressionMethod : CompressionMethod|null = null
$deflateLevel : int|null = null
$lastModificationDateTime : DateTimeInterface|null = null
$maxSize : int|null = null
$exactSize : int|null = null
$enableZeroHeader : bool|null = null

executeSimulation()

Executes a previously calculated simulation.

public executeSimulation() : void
Example
$zip = new ZipStream(
  outputName: 'foo.zip',
  operationMode: OperationMode::SIMULATE_STRICT,
);

$zip->addFile('test.txt', 'Hello World');

$size = $zip->finish();

header('Content-Length: '. $size);

$zip->executeSimulation();

finish()

Write zip footer to stream.

public finish() : int

The class is left in an unusable state after finish.

Example
// write footer to stream
$zip->finish();
Return values
int

clear()

Clear all internal variables. Note that the stream object is not usable after this.

private clear() : void

recordSentBytes()

Record sent bytes

private recordSentBytes(int $sentBytes) : void
Parameters
$sentBytes : int

send()

Send string, sending HTTP headers if necessary.

private send(string $data) : void

Flush output after write if configure option is set.

Parameters
$data : string

sendHttpHeaders()

Send HTTP headers for this stream.

private sendHttpHeaders() : void

        
On this page

Search results