看socket 好多东西不明白
网上下了个html5 发socket 给php.server
php.server里面有些地方不明白呀
部分代码
function __construct ($address, $port) {
error_reporting (e_all);
set_time_limit (0);
ob_implicit_flush ();
// socket creation
$this->master = socket_create (af_inet, sock_stream, sol_tcp) or die(socket_create() failed);
socket_set_option ($this->master, sol_socket, so_reuseaddr, 1) or die(socket_option() failed);
socket_bind ($this->master, $address, $port) or die(socket_bind() failed);
socket_listen ($this->master, 20) or die(socket_listen() failed);
$this->sockets[] = $this->master;
$this->say (server started : . date ('y-m-d h:i:s'));
$this->say (listening on : {$address} {$port});
$this->say (master socket : {$this->master}\n);
// main loop
while (true) {
$changed = $this->sockets;
socket_select ($changed, $write = null, $except = null, null);
foreach ($changed as $socket) {
if ($socket == $this->master) {
$client = socket_accept ($this->master);
if ($client log (socket_accept() failed);
continue;
}
else {
// connects the socket
$this->connect ($client);
}
}
else {
$bytes = @socket_recv ($socket, $buffer, 2048, 0);
if ($bytes == 0) {
// on socket.close ();
$this->disconnect ($socket);
}
else {
// retrieve the user from his socket
$user = $this->getuserbysocket ($socket);
if (!$user->handshake) {
$this->dohandshake ($user, $buffer);
}
else {
$this->process ($user, $this->decode ($buffer));
}
}
}
}
}
}
我现在linux 下运行了 server.php php server.php
我发现
socket_select ($changed, $write = null, $except = null, null);的时候
就不会在往下下运行了
我在网上查了下socket_select
地址是http://php.net/manual/en/function.socket-select.php
socket_select ― runs the select() system call on the given arrays of sockets with a specified timeout
socket_select() accepts arrays of sockets and waits for them to change status. those coming with bsd sockets background will recognize that those socket resource arrays are in fact the so-called file descriptor sets. three independent arrays of socket resources are watched.
按我的理解 这个socket_select 可以监听到 sockets 数组里面的东西的状态的变化
当状态没有变化的时候 是挂起的 就是不会往下执行
这么理解对吗
------解决方案--------------------
socket_select()是等待连接全部有新动态时结束,它有个timeout参数至关重要,其中规定了它最多可以阻塞(可以理解为运行)多长时间。你传入的为 null ,则这个函数将会在有所有监听对象有新连接出现后再结束。