ID:               24033
 Comment by:       PJ at Elitegamer dot com
 Reported By:      thomas at nimstad dot com
 Status:           Open
 Bug Type:         Documentation problem
 Operating System: Win32
 PHP Version:      4.3.2
 New Comment:

I too am experiencing this changed behavior. Previously, my code was as
follows:

     $contents = fread ($fp, 2097152);

And that would return up to 2mb from the given socket. In my case, the
socket was a fopen() url.
  
However, when I upgraded to PHP 4.3.2 it would ONLY return 2481 bytes
no matter what. As a quick fix I had to move the fread() inside of a
while loop, in order to fix this issue. Like this:

     $contents = "";
     while (($data = fread ($fp, 2097152)) !== "") 
     {
          $contents .= $data;
     }

The only change on my system and the files being read was my upgrading
to PHP 4.3.2. This definitely appears to be changed behavior of
fread().
-PJ


Previous Comments:
------------------------------------------------------------------------

[2003-06-05 02:56:25] thomas at nimstad dot com

I don't think it's a documentation problem of fread().

The posted code worked fine in 4.3.1 but failed when upgrading to 4.3.2
(Win32 version).

Problem 1: fread($fp, 4096) returns max 1024 bytes.
Problem 2: fread($fp, 1024) hangs until timeout if buffer only contains
1023 bytes.

/Thomas

------------------------------------------------------------------------

[2003-06-05 02:45:00] [EMAIL PROTECTED]

Can you please tell us where in the documentation this is done wrong?

------------------------------------------------------------------------

[2003-06-05 02:28:46] thomas at nimstad dot com

Problem: 
fread() hangs if not reading exact number of bytes from a socket.
worked previously in 4.3.1.

fread() returns max 1024 bytes even if specifying larger numbers.
worked previously in 4.3.1.

Worked previously (snipped):
  $fp = fsockopen("localhost", 5410, $errno, $errstr, 100);
  // Send request
  if (!fputs($fp, $packet, strlen($packet))) { }

  // Read result header
  while (!feof($fp)) {
    $line = fgets($fp);

    if ($line != "\n" && $line != "\r\n") {
      $header .= $line;
    }
    else {
      if (preg_match('/Content-Length: (\d+)/i', $header, $matches))
        $length = $matches[1];

      if (preg_match('/X-Session-Id: (\d*)/i', $header, $matches))
        $session = $matches[1];
        
      break;
    }
  }

  // Read result body
  $reply = fread($fp, $length);

This hangs the executions until timeout (30 sec).

Have to change the read result body to:

  while (!feof($fp) && $length > 0) {
    $size = min(1024, $length);
    $reply .= fread($fp, $size);
    $length -= $size;
  }

All examples in documentation and even the PEAR/XML-RPC class states
the "old" way what it looks to me.

What's up? New settings that i'm not aware of?

/Thomas

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=24033&edit=1


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

Reply via email to