网上下了个html5 发socket 给php.serverphp.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 < 0) {
$this->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.phpsocket_select — Runs the select() system call on the given arrays of sockets with a specified timeoutsocket_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 数组里面的东西的状态的变化
当状态没有变化的时候 是挂起的 就是不会往下执行
这么理解对吗

解决方案 »

  1.   

    socket_select()是等待连接全部有新动态时结束,它有个timeout参数至关重要,其中规定了它最多可以阻塞(可以理解为运行)多长时间。你传入的为 NULL ,则这个函数将会在有所有监听对象有新连接出现后再结束。
    socket_accept()是阻塞型的,当出现新的连接,这个函数才会结束。程序至所以这么写,是为了改善现有的这种阻塞式机制。想想看,如果没有新连接,socket_accept()将永远不会结束。而如果用 socket_select()限时监听,程序就可以腾出空去做其它事
      

  2.   

    我又Google了一下,我前面说的 则这个函数将会在有所有监听对象有新连接出现后再结束。
    是错误的。它什么时候结束取决于timeout设置
    如果为0:则立即结束
    如果为n>1: 则最多在n秒后结束,如遇某一个连接有新动态,则提前返回
    如果为null:如遇某一个连接有新动态,则返回
      

  3.   

    我今天测试了好长时间了
    是你说的那样
    socket_select ($changed, $write = NULL, $except = NULL, NULL)
    有返回的时候
    $changed里面的值就返回的socket  (当浏览器有websocket请求的时候, $changed就有值了)有值了 然后就可以往下执行了