Php stream_select如何工作?

时间:2014-05-28 15:32:34

标签: php sockets

public function __construct() {
    if (!$this->Listen()) {
        throw new Exception;
    }
     while (1) {
        $read = $this->master;
        $mod_fd = stream_select($read, $w = null, $e = null, 5, 00);
        if ($mod_fd === FALSE) {
            throw new Exception;
        }
        foreach ($read as $feed => $stream) {
            if ($stream === $this->master['main']) {
                $conn = stream_socket_accept($this->master['main']);
                $this->master[count($this->master)] = $conn;
            } else {
                $this->ReadStream($feed, $stream);
            }
        }
    }
}

private function Listen() {
    $socket = stream_socket_server("tcp://0.0.0.0:6001", $errno, $errstr);
    if ($errstr != '') {
        return false;
    }
    $this->master['main'] = $socket;
    return true;
}

我的理解是,stream_select会将$read填入有可供阅读的数据流。

我的目的是一个接一个地读取$read中的每个流,但ReadStream内部发生了一些非常糟糕的事情,有时数据似乎来自不同于我预期的流。< / p>

在我有机会循环之前,$read可能正在修改stream_select?但我认为这个过程中的每一个都是异步发生的,所以现在我完全糊涂了

1 个答案:

答案 0 :(得分:1)

您正在创建套接字,因此您需要使用socket_select,而不是stream_select。后者用于文件流。

您需要致电socket_read以获取相关数据。

PHP手册在评论部分有一些创建示例。