socket_select( array &$read, array &$write, array &$except, int $tv_sec[, int $tv_usec = 0] )
个中,
$read存放可读的socket凑集,即遍历那些socket读缓冲区不为空
$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处理完毕后,再进行。这样大大提升了通信效率