|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2016-04-04 03:32 UTC] grzegorz129 at gmail dot com
Description:
------------
Following test script works as expected on OS X, but not on Linux.
System details:
- Linux X 4.3.0-1-amd64 #1 SMP Debian 4.3.5-1 (2016-02-06) x86_64 GNU/Linux
- Debian stretch/sid
Test script:
---------------
<?php
$server = stream_socket_server('tcp://127.0.0.1:9999');
$clientOnClient = stream_socket_client('tcp://127.0.0.1:9999');
$clientOnServer = stream_socket_accept($server, 0.5);
var_dump(stream_set_chunk_size($clientOnServer, 1));
var_dump(stream_set_read_buffer($clientOnServer, 1));
fwrite($clientOnClient, 'ping');
var_dump(fread($clientOnServer, 2));
stream_socket_shutdown($clientOnServer, STREAM_SHUT_RD);
var_dump(fread($clientOnServer, 2));
Expected result:
----------------
int(----)
int(0)
string(2) "pi"
string(2) "ng"
Actual result:
--------------
int(8192)
int(0)
string(2) "pi"
string(0) ""
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 04:00:02 2025 UTC |
This documentation not is quite nice, maybe not 100% clear for beginners but anyway - it's somewhat weird how it's actually working. Let's take a look at this code: <?php $server = stream_socket_server('tcp://127.0.0.1:9999'); $clientOnClient = stream_socket_client('tcp://127.0.0.1:9999'); $clientOnServer = stream_socket_accept($server, 0.5); var_dump(stream_set_chunk_size($clientOnServer, 1)); var_dump(stream_set_read_buffer($clientOnServer, 1)); fwrite($clientOnClient, 'ping'); //This now works as defined in documentation var_dump(fread($clientOnServer, 2)); stream_socket_shutdown($clientOnServer, STREAM_SHUT_RD); var_dump(fread($clientOnServer, 3)); //This should not work since buffer is empty at call stream_socket_shutdown($clientOnServer, STREAM_SHUT_RD); fwrite($clientOnClient, 'still-broken'); var_dump(fread($clientOnServer, 12)); //...and iterestingly it works as expected if you use RDWR or WR stream_socket_shutdown($clientOnServer, STREAM_SHUT_WR); fwrite($clientOnClient, 'or-is-it'); var_dump(fread($clientOnServer, 8)); Since buffer is closed and in fact event emptied why it's still receiving data on Linux? ;) To be entirely sure I've also tested it using PHP server on the one side and telnet at the other - stream still receives data. This behavior is also present while using sockets. <?php $server = stream_socket_server('tcp://127.0.0.1:9999'); $clientOnServer = stream_socket_accept($server, 10); stream_socket_shutdown($clientOnServer, STREAM_SHUT_RD); while(1) { sleep(1); var_dump(fread($clientOnServer, 1)); }