From:             michel dot sanchez dot 83 at gmail dot com
Operating system: Linux
PHP version:      5.4.12
Package:          Streams related
Bug Type:         Bug
Bug description:strange stream_socket_client

Description:
------------
In order to communicate with many servers at the same time in a persistent
way, i use the stream_socket_client function.

Once the connection is established with all the servers, I wait for the
http timeout of each connection.

The servers send a "close_wait".

When i try to reused the previous connections, a new connection is
automaticaly establish with the first server while all other connections
are reused with a feof available.

Why the first connection not have the same comportment than other ?

Test script:
---------------
<!DOCTYPE html>
<meta charset="utf-8">
<title>Bug in stream_socket_client ?</title>

<pre><?php

ob_start();

$remotes = array (
    'cl108.advertstream.com' => '91.121.95.33',
    'cl109.advertstream.com' => '94.23.35.164',
    'cl111.advertstream.com' => '94.23.206.224',
    'cl121.advertstream.com' => '91.121.163.5',
);

$errno;
$errstr;

$read = [];

foreach ($remotes as $key => $target) {

    do {

        $socket = stream_socket_client(
            'tcp://'.$target.':80',
            $errno,
            $errstr,
            0.700,
            STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT
        );

        stream_set_blocking($socket, 0);

        $reused = (bool) ftell($socket);
        fread($socket, 4096);
        $want_close = feof($socket);

        $local = stream_socket_get_name($socket, false);

        if (true === $want_close) {
            echo $key . ' (' . $local . '): want_close' . PHP_EOL;
            fclose($socket);
            continue;
        }

        if (true === $reused) {
            echo $key . ' (' . $local . '): reused connection' . PHP_EOL;
        } else {
            echo $key . ' (' . $local . '): new connection' . PHP_EOL;
        }

        echo PHP_EOL;

        break;

    } while (true);

    $read[] = $socket;

    $message = "GET / HTTP/1.1\r\n".
        "Host: $host\r\n".
        "Connection: Keep-Alive\r\n".
        "\r\n";

    fwrite($socket, $message);
}

$write;
$except;
$originalRead = $read;

$success = 0;
$iteration = count($originalRead);

do {

    stream_select($read, $write, $except, 0, 500e3);

    foreach ($read as $stream) {
        $bytes = fread($stream, 4096);

        if (false !==  strpos($bytes, "0\r\n\r\n")) {
            $success++;
        }
    }

    if ($iteration === $success) {
        break;
    }

    $read = $originalRead;

} while (true);

ob_end_flush();

?></pre>

Expected result:
----------------
 - calling script (1)

cl108.advertstream.com (192.168.2.10:59816): new connection
cl109.advertstream.com (192.168.2.10:52000): new connection
cl111.advertstream.com (192.168.2.10:43161): new connection
cl121.advertstream.com (192.168.2.10:39815): new connection

 - watching netstat

tcp        0      0 michel-p6-2312ef.:59816 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52000 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43161 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39815 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59816 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52000 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43161 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39815 cl121.advertstream:http
CLOSE_WAIT

 - calling script (2)

cl108.advertstream.com (192.168.2.10:59816): want_close <<<< EXPECTED <<<<
cl108.advertstream.com (192.168.2.10:59821): new connection
cl109.advertstream.com (192.168.2.10:52000): want_close
cl109.advertstream.com (192.168.2.10:52005): new connection
cl111.advertstream.com (192.168.2.10:43161): want_close
cl111.advertstream.com (192.168.2.10:43166): new connection
cl121.advertstream.com (192.168.2.10:39815): want_close
cl121.advertstream.com (192.168.2.10:39820): new connection

 - watching netstat

tcp        0      0 michel-p6-2312ef.:59821 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52005 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43166 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39820 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59821 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52005 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43166 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39820 cl121.advertstream:http
CLOSE_WAIT

 - calling script (3)

cl108.advertstream.com (192.168.2.10:59821): want_close <<<< EXPECTED <<<<
cl108.advertstream.com (192.168.2.10:59826): new connection
cl109.advertstream.com (192.168.2.10:52005): want_close
cl109.advertstream.com (192.168.2.10:52010): new connection
cl111.advertstream.com (192.168.2.10:43166): want_close
cl111.advertstream.com (192.168.2.10:43171): new connection
cl121.advertstream.com (192.168.2.10:39820): want_close
cl121.advertstream.com (192.168.2.10:39825): new connection

tcp        0      0 michel-p6-2312ef.:59826 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52010 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43171 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39825 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59826 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52010 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43171 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39825 cl121.advertstream:http
CLOSE_WAIT

 - ...

Actual result:
--------------
 - calling script (1)

cl108.advertstream.com (192.168.2.10:59816): new connection
cl109.advertstream.com (192.168.2.10:52000): new connection
cl111.advertstream.com (192.168.2.10:43161): new connection
cl121.advertstream.com (192.168.2.10:39815): new connection

 - watching netstat

tcp        0      0 michel-p6-2312ef.:59816 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52000 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43161 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39815 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59816 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52000 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43161 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39815 cl121.advertstream:http
CLOSE_WAIT

 - calling script (2)

cl108.advertstream.com (192.168.2.10:59821): new connection
cl109.advertstream.com (192.168.2.10:52000): want_close
cl109.advertstream.com (192.168.2.10:52005): new connection
cl111.advertstream.com (192.168.2.10:43161): want_close
cl111.advertstream.com (192.168.2.10:43166): new connection
cl121.advertstream.com (192.168.2.10:39815): want_close
cl121.advertstream.com (192.168.2.10:39820): new connection

 - watching netstat

tcp        0      0 michel-p6-2312ef.:59821 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52005 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43166 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39820 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59821 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52005 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43166 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39820 cl121.advertstream:http
CLOSE_WAIT

 - calling script (3)

cl108.advertstream.com (192.168.2.10:59826): new connection
cl109.advertstream.com (192.168.2.10:52005): want_close
cl109.advertstream.com (192.168.2.10:52010): new connection
cl111.advertstream.com (192.168.2.10:43166): want_close
cl111.advertstream.com (192.168.2.10:43171): new connection
cl121.advertstream.com (192.168.2.10:39820): want_close
cl121.advertstream.com (192.168.2.10:39825): new connection

tcp        0      0 michel-p6-2312ef.:59826 cl108.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:52010 cl109.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:43171 cl111.advertstream:http
ESTABLISHED
tcp        0      0 michel-p6-2312ef.:39825 cl121.advertstream:http
ESTABLISHED

 - waiting for http timeout...
 - watching netstat

tcp        1      0 michel-p6-2312ef.:59826 cl108.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:52010 cl109.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:43171 cl111.advertstream:http
CLOSE_WAIT
tcp        1      0 michel-p6-2312ef.:39825 cl121.advertstream:http
CLOSE_WAIT

 - ...

-- 
Edit bug report at https://bugs.php.net/bug.php?id=64398&edit=1
-- 
Try a snapshot (PHP 5.4):   
https://bugs.php.net/fix.php?id=64398&r=trysnapshot54
Try a snapshot (PHP 5.3):   
https://bugs.php.net/fix.php?id=64398&r=trysnapshot53
Try a snapshot (trunk):     
https://bugs.php.net/fix.php?id=64398&r=trysnapshottrunk
Fixed in SVN:               https://bugs.php.net/fix.php?id=64398&r=fixed
Fixed in release:           https://bugs.php.net/fix.php?id=64398&r=alreadyfixed
Need backtrace:             https://bugs.php.net/fix.php?id=64398&r=needtrace
Need Reproduce Script:      https://bugs.php.net/fix.php?id=64398&r=needscript
Try newer version:          https://bugs.php.net/fix.php?id=64398&r=oldversion
Not developer issue:        https://bugs.php.net/fix.php?id=64398&r=support
Expected behavior:          https://bugs.php.net/fix.php?id=64398&r=notwrong
Not enough info:            
https://bugs.php.net/fix.php?id=64398&r=notenoughinfo
Submitted twice:            
https://bugs.php.net/fix.php?id=64398&r=submittedtwice
register_globals:           https://bugs.php.net/fix.php?id=64398&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=64398&r=php4
Daylight Savings:           https://bugs.php.net/fix.php?id=64398&r=dst
IIS Stability:              https://bugs.php.net/fix.php?id=64398&r=isapi
Install GNU Sed:            https://bugs.php.net/fix.php?id=64398&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=64398&r=float
No Zend Extensions:         https://bugs.php.net/fix.php?id=64398&r=nozend
MySQL Configuration Error:  https://bugs.php.net/fix.php?id=64398&r=mysqlcfg

Reply via email to