RE: Debugging custom streams

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > 
> >>-----Original Message-----
> >>From: Jochem Maas [mailto:jochem@xxxxxxxxxxxxx]
> >>Sent: 10 February 2006 14:17
> >>To: Jared.Williams@xxxxxxxxxxxx
> >>Cc: php-general@xxxxxxxxxxxxx
> >>Subject: Re:  Debugging custom streams
> >>
> >>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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux