#42497 [Opn->Bgs]: fgets causes PHP hang on socket file pointer
| From: | jani@php.net | Date: | Mon, 22 Oct 2007 11:28:05 +0000 |
| Subject: | #42497 [Opn->Bgs]: fgets causes PHP hang on socket file pointer | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-118825@lists.php.net to get a copy of this message | ||
ID: 42497
Updated by: jani@php.net
Reported By: donald at designknights dot com
-Status: Open
+Status: Bogus
Bug Type: Network related
Operating System: SUSE linux 10.1
PHP Version: 5.2.4
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
Previous Comments:
------------------------------------------------------------------------
[2007-08-31 18:37:55] donald at designknights dot com
i have stream_set_blocking = 1 and used stream_get_line instead of
fgets
this seems to have solved the race condition.
------------------------------------------------------------------------
[2007-08-31 15:51:30] donald at designknights dot com
Description:
------------
this is a script to connect to a pop3 server and parse emails.
$connection = fsockopen($popServer, $port, $error ,$string ,$timeout);
$response = fgets($connection, $buffer);
$newLine = "\r\n";
$localhost = "www.designknights.com";
if(empty($connection)) {
echo "Failed to connect: $response";
exit;
}
else {
$logArray['connection'] = "Connected to: $response";
}
echo "sending username<br>";
ob_flush();
flush();
fputs($connection, "USER $username". $newLine);
$response = fgets($connection, $buffer);
$logArray['userresponse'] = "$response";
fputs($connection, "PASS $password". $newLine);
$response = fgets($connection, $buffer);
$logArray['passresponse'] = "$response";
if (substr($response,0,3)!="+OK"){
echo "Mail server said: ".$response;
exit;
}
fputs($connection,"LIST".$newLine);
$msg_array = array();
$response = fgets($connection,$buffer);
$logArray['listresponse'] = "$response";
$messages = explode(" ",$response);
$nummessages = $messages['1'];
echo "number of messages =".$nummessages;
stream_set_blocking($connection,1);
for ($i=1;$i<=$nummessages;$i++){
fputs($connection,"retr ".$i.$newLine,$buffer);
$message = '';
$line = '';
//This loop is where it hangs
while (!feof($connection){
$line = fgets($connection,$buffer);
echo "<br> line = $line";
ob_flush();
flush();
}
$message_blown = explode(":",$message);
echo "<br> message $i = <br>";
print_r($message_blown);
}
echo "return = ".print_r($messages)."<br>";
print_r($logArray);
fclose($connection);
Reproduce code:
---------------
See above
Expected result:
----------------
It should to my understanding put the lines into the var names $message
then explode that message into $message_blown using : as a separator.
Actual result:
--------------
it hangs and the max execution time kills php5 while running the
script.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=42497&edit=1