socket_select( array &$read, array &$write, array &$except, int $tv_sec[, int $tv_usec = 0] )

个中,

$read存放可读的socket凑集,即遍历那些socket读缓冲区不为空

select默认选中php68php select案例 Python

$write存放可写socket凑集,即遍历哪些socket写缓冲区为空

$except打消不进行遍历监听的socket凑集

$tv_sec韶光,单位为秒

$tv_usec韶光,单位为奇妙

默认情形,socket_select根据设置的($tv_sec+$tv_usec)进行壅塞,如都为零,则不壅塞立即返回

2、案例

创建一个tcp做事端.再利用telnet作为客户端进行测试

2.1、源码

<?php

/

Copyright (C) Iamasb

@project : 3、workerman干系知识点

@explain : select函数利用

@filename : 33、select函数利用.php

@author : xiaobei

/

// 创建tcp

if (!($resource = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))) {

echo \公众socket create is error\"大众;

exit();

}

// 绑定当前主机和端口

if (!socket_bind($resource,'0.0.0.0','1234')) {

echo \"大众socket bind is error\"大众;

exit();

}

// 启动监听

if (!socket_listen($resource)) {

echo \"大众socket listen is error\公众;

exit();

}

// 设置端口复用

if (!socket_set_option($resource, SOL_SOCKET, SO_REUSEADDR, 1)) {

echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;

exit;

}

$read[] = $resource;

$write = NULL;

$except = NULL;

$start = \"大众welcome to!\r\n\"大众;

$end = \"大众good bye \r\n\公众;

while (true) {

$rst = $read;

socket_select($rst,$write,$except,0);

if (count($rst)) {

foreach ($rst as $value) {

// 判断是否是主socket,还是子socket

if ($value === $resource) {

$client = socket_accept($resource);

socket_write($client,$start,strlen($start));

$read[] = $client;

} else {

$str = trim(socket_read($value,1024));

if ($str == \公众quit\公众) {

socket_write($value,$end,strlen($end));

socket_close($value);

$key = array_search($value,$read);

unset($read[$key]);

echo \公众client->\"大众,$key,\公众--> close.\"大众;

}

echo \"大众receive-> \公众,$str,PHP_EOL;

}

}

}

}

2.2、测试

启动tcp做事端telnet进行连接

tcp做事端

3、总结

由上面的运行结果,可以看出,当某个telnet发起数据交互时,做事端都能够及时进行处理。
而不用等到一个socket处理完毕后,再进行。
这样大大提升了通信效率