Ahha, after some rethinking, I've dropped the append custom stream, as its not 
really required.

And instead of using a custom in memory stream for handling the central 
directory stream, just using tmpfile(), the application
error has disappeared.

Jared


> > >>Jared Williams wrote:
> > >>
> > >>>Hi,
> > >>> Short version, is there any way of listing all open
> > >>
> > >>resources from
> > >>
> > >>>within a PHP script? Think I may have a problem relating to
> > >>
> > >>the object/resource shutdown order within PHP, but cant see which 
> > >>custom stream handler still has an open resource.
> > 
> > why not let your zip class keep a list of opened streams (I can't 
> > imagine that it's not doing that already) and write a 
> function which 
> > will output a list of 'registered' stream resources that are still 
> > open [mis]using ftell() or feof() to check which streams are still 
> > 'active'.
> 
> There can only be one open stream at a time, when writing, as 
> a stream writes to what will be the final zip file, and if 
> they were not closed in the correct manner the resulting zip 
> file wouldn't be valid.
> 
> Perhaps I should explain in abit more detail how this is working.
> 
> The ZipArchive creates two streams, one for the actual final 
> zip, and the another for the central directories headers.
> 
> When fputs($stream, '0123456789') occurs the data goes 
> through 2 custom streams, and an optional filter.
> 
> Zip custom stream -> optional compression filter -> Append 
> custom stream -> final zip file.
> 
> The Zip custom stream, handles writing the local header to 
> the final zip file, calculating the compressed and 
> uncompressed size, and crc (using hash extension). Like so 
> 
>       function stream_write($data)
>       { 
>               $r = fwrite($this->compressedStream, $data);
>               $this->uncompressedSize += strlen($data);
>               hash_update($this->hashContext, $data);
>               return $r;
>       }
> 
> When the Zip custom stream is closed the zip local header is 
> rewritten with the correct values, and a central directory 
> header is written to the central directory stream. So if any 
> resource was left open, then an invalid zip file would result. 
> 
> All $zip->close() has left todo, is append the central 
> directory stream contents to the final zip, add a central end 
> directory header and close both streams for a valid zip.
> 
> Jared

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to