Re: fread() question
| From: | Simon Fredriksson | Date: | Sat, 12 Jul 2003 03:27:20 +0000 |
| Subject: | Re: fread() question | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-154951@lists.php.net to get a copy of this message | ||
Wouldn't it be easier to use something like the following?
while (!feof ($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
This will read until there's nothing more to read. Isn't that what you're trying to do?
Read more about it at http://se2.php.net/manual/en/function.fgets.php
//Simon
Seairth Jacobs wrote:
I have an open socket that I am reading from. The code looks like the following: $contentLength = 0 + $this->response['headers']['content-length']; do{$status = socket_get_status($this->socket);if( $status['eof'] == 1 ) { if( $this->clientOptions['debug'] & DBGSOCK ) echo("DBG.SOCK statuseof met, finished socket_read\n");break; }if($status['unread_bytes'] > 0) {if($contentLength > $status['unread_bytes']) { echo("DBG.SOCK reading {$status['unread_bytes']} bytes...\n"); $buffer = @fread($this->socket, $status['unread_bytes']);$contentLength = $contentLength - $status['unread_bytes']; } else { $buffer = @fread($this->socket, $contentLength); $contentLength = 0; } } else { if( $this->clientOptions['debug'] & DBGSOCK ) echo("DBG.SOCK reading{$status['unread_bytes']} bytes...\n");usleep(1); continue; }$data .= $buffer;} while($contentLength > 0); Now, the above code hangs (infinite loop, actually), ultimately returning something like: DBG.SOCK reading 3993 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... DBG.SOCK reading 0 bytes... etc... On the other hand, if I change the following lines:$buffer = @fread($this->socket, $status['unread_bytes'] - 1);$contentLength = $contentLength - $status['unread_bytes'] - 1;Then I get something that looks like: DBG.SOCK reading 3993 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... DBG.SOCK reading 1 bytes... etc... until the entire response has been read (88771 bytes in this case). Also, this would mean that the effective fread would be:$buffer = @fread($this->socket, 0);However, if I just do: $data = @fread($this->socket, $contentLength); it works as expected. So what's going on? For now, I will use the single command in place of the loop, but I really wanted to monitor the current unread bytes. Any thoughts appreciated. --- Seairth Jacobs seairth@seairth.com