#43782 [Com]: feof() does not detect timeout on socket

From: Date: Thu, 27 Nov 2008 14:17:56 +0000
Subject: #43782 [Com]: feof() does not detect timeout on socket
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-1551@lists.php.net to get a copy of this message
 ID:               43782
 Comment by:       x2012x at ymail dot com
 Reported By:      ml at foofree dot sk
 Status:           Open
 Bug Type:         Documentation problem
 Operating System: *
 PHP Version:      5.2,5.3CVS (2008-07-15)
 New Comment:

From an end-user/developer standpoint, it would be preferred to have
this issue addressed instead of just updating the documentation. 

Here's another real-world example of the issue being encountered.

Excerpt:
========
// Establish a socket connection with the designated host.
$_SESSION['socketCon'] = fsockopen($strHost, $strPort, $errNum,
$errStr, $strTimeOut);
stream_set_blocking($_SESSION['socketCon'], 1);
stream_set_timeout($_SESSION['socketCon'], 3);
// Check to see if the socket connection could be established, if not
display relevant error info.
if (!$_SESSION['socketCon'])
 {
   $errors .= "Cannot connect to socket!!!\r\n";
   $errors .= "Details:\r\n";
   $errors .= "Host: $strHost\r\n";
   $errors .= "Port: $strPort\r\n";
   $errors .= "Timeout value: $strTimeOut\r\n";
   $errors .= "Error #: $errNum\r\n";
   $errors .= "Response: $errStr\r\n";
   errorHandler($errors, "ERROR");
   stopTrans();
   $console->destroy();
   return 1;
 }
else
 {
   // Notify the user that a socket connection has been established.
   updateOutPut($console, $outPut, "Connected to $strHost on port
$strPort\r");

   // Send the terminal transaction data over the established socket
connection.
   updateOutPut($console, $outPut, "\rTransmitting: \r");
   updateOutPut($console, $outPut, "$sendingData ");
   fputs($_SESSION['socketCon'], $sendingData . "\n");       
		
   // Loop through the response from the server and print it to
console.
   updateOutPut($console, $outPut,"\r\rResponse: \r");
   while(!feof($_SESSION['socketCon'])) 
    {
      $response = fgets($_SESSION['socketCon'], 4096);
      updateOutPut($console, $outPut, "$response");
    } 
   // Close the socket connection.
   fclose($_SESSION['socketCon']);
 }
========

If the socket server does not close the connection in the above !feof
while loop, the function will get stuck looping in the while loop. It is
my opinion that this sort of functionality ( a working timeout value )
is very fundamental. I've been using PHP for many years now and I am
glad that this is the first bug that I've encountered to be major in my
opinion. Please consider addressing the actual bug and not just
modifying documentation. Thanks for your time.


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

[2008-11-24 15:38:52] dsp@php.net

The patch was reverted as it caused problems. We might want to edit the
documentation instead.

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

[2008-08-26 16:06:45] dsp@php.net

This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.



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

[2008-01-08 01:19:23] ml at foofree dot sk

Description:
------------
From docs:

"Returns TRUE if the file pointer is at EOF or an error occurs
(including socket timeout); otherwise returns FALSE."

...

"If a connection opened by fsockopen() wasn't closed by the server,
feof() will wait until a timeout has been reached to return TRUE. The
default timeout value is 60 seconds. You may use stream_set_timeout() to
change this value."



feof() dows not wait and returns TRUE instead of FALSE if timeout
reached (server does not closed connection and there is no data in
timeout time slot).

* server does not closed connection,
* timeout wa reached

Reproduce code:
---------------
$s = stream_socket_client('tcp://www.php.net:80', $errno, $errstr, 10,
STREAM_CLIENT_CONNECT);

stream_set_timeout($s, 4);

$response = '';
while (feof($s) !== TRUE) {

   if (($foo = @fread($s, 1024 * 8)) === FALSE) return NULL;
   $response = $response . $foo;
};

print "OK";

Expected result:
----------------
prints "OK" approx. in 4 seconds

Actual result:
--------------
hangs forever


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


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



Thread (6 messages)

« previous php.doc.bugs (#1551) next »