php select false,php – socket_select立即返回false但没有错误代码

我正在玩socket_select,但在一个托管上,这个函数做了一些奇怪的事情:

>立即返回,而不是等待5秒

>返回false,表示有些错误

>但是socket_last_error()返回0(成功).

$server = socket_create( AF_UNIX, SOCK_STREAM, 0 );

$r = socket_bind( $server, '/some/file/somewhere');

$r = socket_listen( $server );

// none of the above socket_* returns false

$t = microtime(true);

socket_clear_error();

$read = array( $server ); $write = null; $except = null;

$read = array( $server ); $write = array(); $except = array();

$read = array(); $write = array(); $except = array();

$read = null; $write = null; $except = null;

$changed = socket_select( $read, $write, $except, 5,0 );

$changed = socket_select( $read, $write, $except, null );

$changed = socket_select( $read, $write, $except, 5000000 );

$changed = socket_select( $read, $write, $except, 5000000, 0 );

$changed = socket_select( $read, $write, $except, 5000000, 5000000 );

/* Results:

microtime(true) - $t == almost zero

$changed === false

socket_last_error() === 0

socket_strerror(socket_last_error()) === Success

$read === array(1) {

[0]=>

resource(2) of type (Socket)

}

$write === NULL

$except === NULL

*/

$s = socket_read( $server, 1024, PHP_BINARY_READ );

// $s === false

这里发生了什么?

更新的测试脚本:仍然在瞬间运行:

header('Content-Type: text/plain; charset=utf-8');

error_reporting(-1);

for( $i = 0; $i < 4; $i++ ){

for( $j = 0; $j < 5; $j++ ){

echo "\n\n\n\n\n[i,j]=[{$i},{$j}]\n";

$socket = socket_create( AF_UNIX, SOCK_STREAM, 0 );

var_dump('socket_create', $socket ); echo "\n"; if( $socket === false ) continue;

$socket_file = dirname(__FILE__)."/test_socket_i{$i}_j{$j}";

if( file_exists( $socket_file )) unlink( $socket_file );

$r = socket_bind( $socket, $socket_file );

var_dump('socket_bind', $r ); echo "\n"; if( $r === false ) continue;

$r = socket_listen( $socket );

var_dump('socket_listen', $r ); echo "\n"; if( $r === false ) continue;

$t = microtime(true);

socket_clear_error();

if($i==0){ $read = null; $write = null; $except = null; }

if($i==1){ $read = array(); $write = array(); $except = array(); }

if($i==2){ $read = array( $socket ); $write = null; $except = null; }

if($i==3){ $read = array( $socket ); $write = array(); $except = array(); }

if($j==0){ $changed = socket_select( $read, $write, $except, 5,0 ); } // 5 seconds

if($j==1){ $changed = socket_select( $read, $write, $except, null ); } // forever

if($j==2){ $changed = socket_select( $read, $write, $except, 5000000 ); }

if($j==3){ $changed = socket_select( $read, $write, $except, 5000000, 0 ); }

if($j==4){ $changed = socket_select( $read, $write, $except, 5000000, 5000000 ); }

var_dump('•socket_select returned:', $changed );echo "\n";

var_dump('•$read/$write/$except:',$read,$write,$except);echo "\n";

var_dump('•error:', socket_last_error(), socket_strerror(socket_last_error()) );echo "\n";

var_dump('time: ', microtime(true) - $t );echo "\n"; // almost zero

}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值