ID:               32979
 User updated by:  mjpph at stardust dot fi
 Reported By:      mjpph at stardust dot fi
 Status:           Open
 Bug Type:         Network related
 Operating System: Linux (Fedora Core 3)
 PHP Version:      5CVS-2005-05-08 (dev)
 Assigned To:      wez
 New Comment:

Another update. I modified the test script to connect to HTTP which
doesn't output anything directly but instead waits for request from the
client. In this case the select timeouts on FC3 like it should, but
obviously doesn't return anything either as the connection doesn't
output anything. When the HTTP closes the connection the stream_select
starts behaving like with the SMTP example, looping as fast as it can.
If I change the port to SMTP with instant output, it loops the
stream_select() like a madman without the requested 5 second delay.

The working (FC2) script:
select(4, [3], [], [], {0, 5000})       = 0 (Timeout)
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 4000})
select(4, [3], NULL, NULL, {60, 0})     = 1 (in [3], left {60, 0})

First it selects and timeouts when waiting for data, then it returns 1
for changed streams and the stream resource (3) as the changed stream.
So this works as expected.

Here, the non-working FC3 version:
select(4, [3], [], [], {5, 5000})       = 1 (in [3], left {4, 998000})
select(4, [3], [], [], {5, 5000})       = 1 (in [3], left {5, 5000})
select(4, [3], [], [], {5, 5000})       = 1 (in [3], left {5, 5000})

It returns the same as the FC2 (except the one with the nulls) so this
should indicate AND return PHP's stream_select() with the value of 1,
but by checking the PHP's stream_select() return value it's always 0.
It's like the system level select() works ok but the PHP function fails
to return it's results correctly? Also something that bothers with me
this conclusion is that there's not a single timeout in the FC3 case
which could indicate some other problem as well, maybe the connection
isn't established correctly?


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

[2005-05-26 17:38:20] mjpph at stardust dot fi

I also noticed something funny now. If I use 5 second delay on the
stream_select and watch strace directly it doesn't wait at all, it just
loops stream_select() as fast as it can. Also there's no timeout on the
FC3 straces, but there is one timeout before the successful select on
FC2 strace. One can conclude that the SMTP server responds with 5ms+
delay causing stream_select to timeout once before it gets input. It's
like the FC3 script returns from the stream_select() for some reason
with instant timeout and not actually doing the actual select at all.

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

[2005-05-26 17:30:16] mjpph at stardust dot fi

Also PHP 5.1.0-dev (cli) (built: May 21 2005 21:29:39)
works fine under FC2. It seems this is PHP<>FC3 issue.

Here's strace from the working (FC2) script:
connect(3, {sa_family=AF_INET, sin_port=htons(25),
sin_addr=inet_addr("<HIDDEN>")}, 16) = -1 EINPROGRESS (Operation now in
progress)
select(4, [3], [3], [3], {60, 0})       = 1 (out [3], left {60, 0})
getsockopt(3, SOL_SOCKET, SO_ERROR, [17179869184], [4]) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
select(4, [3], [], [], {0, 5000})       = 0 (Timeout)
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 4000})

Here's strace from the non-working version (FC3)

connect(3, {sa_family=AF_INET, sin_port=htons(25),
sin_addr=inet_addr("<HIDDEN>")}, 16) = -1 EINPROGRESS (Operation
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP, revents=POLLOUT}],
1, 60000) = 1
getsockopt(3, SOL_SOCKET, SO_ERROR, "\0\0\0\0", [12884901892]) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 0})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})

.. to the infinity.

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

[2005-05-26 16:56:43] mjpph at stardust dot fi

The latter has actual ip which I intended to not show, but anyway I had
to use actual IP on the other test machine as it doesn't run it's own
SMTP. Using the actual ip instead of the 127.0.0.1 didn't have any
impact on the non-working machines though.

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

[2005-05-26 16:54:38] mjpph at stardust dot fi

New info, I was able to get the reproduce code to actually work as it's
intended on a Fedora Core 2 machine with PHP 5.0.0RC3 (cgi) (built: Jun
10 2004 16:56:32). Here's strace of it:

read(3, "<?\n$c = stream_socket_client(\"tc"..., 8192) = 199
read(3, "", 4096)                       = 0
read(3, "", 8192)                       = 0
close(3)                                = 0
munmap(0x2a97e16000, 4096)              = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
close(3)                                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl(3, F_GETFL)                       = 0x2 (flags
O_RDWR|O_LARGEFILE)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_INET, sin_port=htons(25),
sin_addr=inet_addr("83.145.20
0.2")}, 16) = -1 EINPROGRESS (Operation now in progress)
select(4, [3], [3], [3], {60, 0})       = 1 (out [3], left {60, 0})
getsockopt(3, SOL_SOCKET, SO_ERROR, [17179869184], [4]) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
select(4, [3], [], [], {0, 5000})       = 0 (Timeout)
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], NULL, NULL, {60, 0})     = 1 (in [3], left {60, 0})

at this point the stream_select returns as intended and script ends.

The reproduce code DOESN'T work with several machines running Fedora
Core 3 by using 5.0.4 as well as with 200505260030 dated snapshot.
stream_select simply doesn't give me anything. Platform is Fedora Core
3 x86_64 under dual xeon 3.2ghz (Nocona, EM64T) with kernel
2.6.11-1.14_FC3smp on the machines that don't return stream_select() as
it should.

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

[2005-05-26 16:42:54] mjpph at stardust dot fi

I used the reproduce code to connect to my own SMTP server, which by
using standard socket functions, telnet or any other method instantly
outputs the welcome message when I connect. Just add IP+Port to some
SMTP server and it'll work for the test.

Here's the strace:
read(3, "<?\n$c = stream_socket_client(\"tc"..., 8192) = 220
read(3, "", 4096)                       = 0
read(3, "", 8192)                       = 0
close(3)                                = 0
munmap(0x2aaaad2e0000, 4096)            = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
close(3)                                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl(3, F_GETFL)                       = 0x2 (flags
O_RDWR|O_LARGEFILE)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_INET, sin_port=htons(25),
sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now
in progress)
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP, revents=POLLOUT}],
1, 60000) = 1
getsockopt(3, SOL_SOCKET, SO_ERROR, "\0\0\0\0", [12884901892]) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 1000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})
select(4, [3], [], [], {0, 5000})       = 1 (in [3], left {0, 5000})

.. it continues like this until I kill the script. The stream_select()
never returns anything. If I do fgets() instead of the stream_select()
it returns the SMTP welcome instantly.

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

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/32979

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

Reply via email to