possible bug in PHP API 1.0.8

Brad Fitzpatrick brad@danga.com
Tue, 12 Aug 2003 13:43:09 -0700 (PDT)


Justin,

Thanks!  The PHP client is known to be buggy (discovered last week), and
Ryan said he's working on it.  Perhaps this is the only fix needed....

Ryan?

- Brad


On Tue, 12 Aug 2003, Justin Matlock wrote:

> Sorry for the extra-long email -- I just wanted to explain my thinking here,
> and go into excessive detail so someone can prove me wrong. :)
>
> I'm using the latest CVS snapshot of memcached, and the 1.0.8 PHP API, and
> the latest PHP 4.3.3 CVS tree, under Linux 2.4.21, Apache 2.0.47.  It was
> all working great on my devel box, but when I moved it over to production, I
> started getting a ton of "_load_items(): Bytes read is greater than
> requested data size." errors.  But the thing is:  the development box and
> production box are using the exact same memcached server.  They run the same
> OS, the same PHP version, the same *everything*.  They're even the same
> hardware (one serial number apart).  The *only* difference is the production
> box is on the same subnet as the memcached server -- the development one is
> on a different one.  Of course, I start doing a lot more testing on the
> development box, and I notice I was getting them over there too, just not as
> many.
>
> So I modified the script to give me more information (patch follows):
>
> =================
> 1063,1064c1063,1064
> <                                       $this->_debug("_load_items(): Bytes
> read is greater than requested data size.");
> <
> ---
> >                                       $this->_debug("_load_items(): Bytes
> read ($bytes_read) is greater than requested data size ($len).");
> >                                       $this->_debug("_load_items(): I
> received \"".urlencode($buf)."\"");
> =================
>
> Here's what I'm getting in my logs (I modified the debug handler to use my
> custom logging routines) -- add 7 for the "\r\nEND\r\n".  So we're getting
> back 2 characters instead of 1:
>
> (Data is "0")
> [03Aug12 154857] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): Bytes
> read (9) is greater than requested data size (1).
> [03Aug12 154857] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): I
> received "%0A2%0D%0AEND%0D%0A"
>
> (Data is "-1")
> [03Aug12 154926] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): Bytes
> read (10) is greater than requested data size (2).
> [03Aug12 154926] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): I
> received "%0A-1%0D%0AEND%0D%0A"
>
> (Data is a whole lot more than "0"  :) ):
> [03Aug12 154926] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): Bytes
> read (165) is greater than requested data size (157).
> [03Aug12 154926] (INFO) #/profile/# <10.1.0.11> (u:1) _load_items(): I
> received "%0Aa%3A1%3A%7Bi%3A0%3Ba%3A5%3A%7Bs%3A7%3A%(for clarity, I cut off
> the end)
>
> The thing that sucks is I can't replicate this reliably.  I can hit reload
> over and over, and it will only happen 1 out of every 10 or so times, on
> random data coming back.  It's not just numerics, not text...
>
> I sniffed the connection, and here's one that barfed coming back from the
> server:
>
> VALUE profile_1_7028277b0e9405414ea71de0bdde789f_rank 0 2\r\n-1\r\nEND\r\n
>
> Looks okay to me; it follows the protocol, and there are two characters in
> the response.  Memcached isn't the culprit.  So on to the API...
>
> The problem appears to be with this line:
> $line = substr($line, strpos($line, "\r\n")+1, strlen($line));
>
> I added some more logging lines before and after it to see what the 'pre'
> and 'post' parsing results were.
>
> By only doing +1, you're just stripping off the \r.  It's always letting a
> \n through, even though it should be stripping it off.  The strange thing to
> me is sometimes it only lets a \n through, but sometimes it lets
> "\n0\r\nEND\r\n" through (this is when it breaks).  I'm still trying to
> track down why this is happening...
>
> In summary; I changed that +1 to a +2, and it always strips off the
> remaining \n.  From there, it works great.  I just pushed about 300 pages,
> and all came back without errors...
>
> Final patch:
> ==============
> 999c999
> <                                       $line = substr($line, strpos($line,
> "\r\n")+1, strlen($line));
> ---
> >                                       $line = substr($line, strpos($line,
> "\r\n")+2, strlen($line));
> ===============
>
> "It works for me".  :)
>
> Justin
>
> ----- Original Message -----
> From: "Ryan Gilfether" <ryan@gilfether.com>
> To: <memcached@lists.danga.com>
> Sent: Monday, August 11, 2003 12:37 AM
> Subject: Re: PHP API 1.0.7
>
>
> > yes, you're right, I didnt notice that a newline got included at the end
> > of the file. I'll be sure to remove it in future releases. Thanks for
> > pointing it out.
> >
> > Ryan
> >
> > Lisa Marie Seelye wrote:
> > > On Sat, 2003-08-09 at 13:08, Ryan Gilfether wrote:
> > >
> > >>A new version of the PHP API has been completed, verson 1.0.7.
> > >>I've had some requests for adding PHPDocs style comments to the API.
> > >>Along with that 3 new function have been added
> > >>error() - returns an error code for the last error genterated
> > >>error_string() - returns a string with a description of the error
> > >>error_clear() - clears the last error
> > >>
> > >>Ryan
> > >
> > >
> > > Not to be incredibly anal, but the .php file should not have any
> > > newlines after the closing ?> tag -- this tends to mess with headers
> > > should it be included after headers have been sent. :(
> > >
> > >
> >
> > --
> > Ryan Gilfether
> > Software Engineer
> > http://www.gilfether.com
> >
> >
>
>