[dev] Imap_Client / streams.

Michael M Slusarz slusarz at horde.org
Wed May 6 00:48:29 UTC 2015


Quoting Michael J Rubinsky <mrubinsk at horde.org>:

> I'm having a hard time trying to track down some memory usage issues  
> I'm seeing and in doing so, I'm trying to better understand what is  
> going on in HIC;  When fetching a specific mime part, like e.g. an  
> attachment, does HIC always use streams, or does it put the entire  
> part's contents in memory at some point? E.g:
>
> $bodypart_params = array(
>   'decode' => true,
>   'peek' => true
> );
> $query->bodyPart($mime_id, $bodypart_params);
>
> $fetch_res = $this->_imap->fetch(
>   $this->_mbox,
>   $query,
>   array('ids' => new Horde_Imap_Client_Ids(array($uid)))
> );
>
>
> If $mime_id is some large attachment, will it ever be placed  
> completely in memory or is at contained in a temporary stream at all  
> times?

The Tokenize library was converting literal data from stream ->  
string, before it was stored in a Data_Fetch object.

So first I eliminated the stream -> string conversion in Tokenize by  
copying the literal data to a separate stream.  This is good (max  
memory hit would be 2 MB), but not perfect.

Second step was to not store literal data in the tokenize stream at  
all when reading from the remote IMAP server, and instead store as  
separate stream objects within the Tokenize object.  Now we should  
only be copying once to a stream on reading from IMAP stream to the  
point that the data becomes available in the Data_Fetch object.

This will appear in Horde_Imap_Client 2.28.1.  I'd like to test this  
for a few days before releasing, since if something is broken with  
these changes it will cause all message body data to be improperly  
parsed.  (All unit tests pass, so that is a good sign.)

michael

___________________________________
Michael Slusarz [slusarz at horde.org]



More information about the dev mailing list