ID:               42497
 User updated by:  donald at designknights dot com
-Summary:          php hangs when using fgets with a socket
 Reported By:      donald at designknights dot com
 Status:           Open
 Bug Type:         Network related
 Operating System: SUSE linux 10.1
 PHP Version:      5.2.4
 New Comment:

i have stream_set_blocking = 1 and used stream_get_line instead of
fgets
this seems to have solved the race condition.


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

[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

Reply via email to