ID:               20033
 User updated by:  [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
-Status:           Feedback
+Status:           Open
 Bug Type:         Sockets related
 Operating System: Red Hat 7.3
 PHP Version:      4CVS-2002-10-22
 New Comment:

PHP doesn't eat a lot of cycles when it crashes.  As I corrected in a
subsequent revision to the post, the connection is being closed and the
script terminates--it even goes through the registered shutdown
function as it terminates.  So no cycles are being eaten.

I've not used gdb.  I could, but I'm not sure if it is applicable in
this case.  If I run the script from the command-line, it works fine. 
If I run it by telneting into the port connected to the script, it
works fine.  It only crashes if a raw (non-Telnet-based) connection is
established to the script by, for example, Eudora mail client or by a
test VB script that opens a raw connection without any potential telnet
connection control.

As for output buffer options, I'm using the default php.ini. If you
tell me what parameters specifically you'd like to know, I can look
those up and/or change them.

Again, what surprises me is that it works in command-line, works when I
connect to it as a daemon via Telnet, but it fails in the
above-described manner when I connect to the same daemon but using a
non-Telnet client; i.e., Eudora connects and fails.  If I write a
custom VB app to just connect to the daemon to observe the problem,
this fails as well.


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

[2002-10-23 16:07:57] [EMAIL PROTECTED]

Does PHP eat a lot of CPU when it hangs?

Are you capable of running it under gdb and obtaining a backtrace?

make sure you are running an --enable-debug build of PHP.
gdb ./sapi/cli/php
run nameofyourscript.php
[hit CTRL-C when it hangs]
bt full

This would be ideal, because then we would know 100%
what was going on.

In light of your comments about shutdown, what happens if you comment
out the fclose() line?

Also, what are your ini settings for output buffer related options?
(and does changing those affect the problem?)


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

[2002-10-23 12:13:57] [EMAIL PROTECTED]

I added requested fflush on $logfile after each fputs.  It still
indicates that it is dying on the "echo".  I.e., logfile shows "Echoing
line" but never reports "Sent."

Additional important correction: I'm not sure whether behavior has
changed or if I was just wrong before, but when the problem presents
itself the script IS shutting down and the TCP/IP connection IS
disconnected.  In fact, it does so cleanly.  It executes my registered
shutdown function.  In that function I had it write to the logfile and
it shows that after the last "Echoing" line it DOES go through the
shutdown function.  Connection_status() within the shutdown function
reports "1" (aborted), but the client side definitely didn't request
the abort.

I have also refined the loop so that the possible infinite loop
situation is handled.  This is a welcome improvement to my code to
handle an "impossible" situation (impossible because it is constrained
elsewhere by logic) but it didn't have any effect on the current
problem.

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

[2002-10-23 06:26:33] [EMAIL PROTECTED]

while(ftell($mailfile) < $EndOfMessagePos)

This line has the potential to cause a indefinete loop and there's no
escape code in the loop, which breaks it.

ftell will return FALSE if an error occurs, which in numerical
comparison resolves to 0.

Can you change that to:
while(ftell($mailfile) and ftell($mailfile) < $EndOfMessagePos)


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

[2002-10-23 03:54:00] [EMAIL PROTECTED]

It's more likely to be a problem with fgets; could you
try fflush($logfile) ing after the fputs lines, just to make sure that
they're not waiting in the buffer.

Also, when php hangs, is it using a lot of CPU?


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

[2002-10-22 17:42:38] [EMAIL PROTECTED]

Code I am using is:

while(ftell($mailfile) < $EndOfMessagePos)
{
 fputs($logfile, "Getting line\n");
 $line = fgets($mailfile, 4096);
 fputs($logfile, "Echoing line\n");
 echo "$line\r\n";
 $fst += strlen($line);
 fputs($logfile, "Sent $fst: $line\n");
 }
echo ".\r\n";
fputs($logfile, "Sent: CRLF\n");
fclose($logfile);

End of log file returns:
--START--
Getting line
Echoing line
Sent 11060: (unimportant email content)
Getting line
Echoing line
Sent 11147: (unimportant email content)
Getting line
Echoing line
--END--

Thus it appears to be hanging on the "echo" line.  

Again, this problem only presents itself when the script is running as
a full server on a "clean" connection.  If the same exact test is run
connecting via the telnet command to port 110 or by running the script
from the command-line there is no problem.  It is my guess that the
telnet command introduces some kind of flow control that is not present
when I open a "real" POP3 connection to the same port.

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/20033

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

Reply via email to