ID: 24033
Updated by: [EMAIL PROTECTED]
Reported By: thomas at nimstad dot com
Status: Open
Bug Type: Documentation problem
Operating System: Win32
PHP Version: 4.3.2
New Comment:
>From the manual:
When reading from network streams or pipes, such as those returned when
reading remote files or from popen() and proc_open(), reading will stop
after a packet is available. This means that you should collect the
data together in chunks as shown in the example below.
A bug existed in 4.3.0-1 that made it "work", so, it's not considered
changed behavior, just a bug. This bug, for example, did not exist in
4.2.3
Regarding Thomas "problem #2", not sure about that, will see what Wez
has to say.
Regarding the last proposed example by PJ, just use
file_get_contents().
Previous Comments:
------------------------------------------------------------------------
[2003-06-05 14:56:49] PJ at Elitegamer dot com
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
------------------------------------------------------------------------
[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