EV_READ的回调方法问题

ayamzh

源码中

        // Non blocking.
        stream_set_blocking($this->_mainSocket, 0);

    public function acceptConnection($socket)
    {
        // Accept a connection on server socket.
        $new_socket = @stream_socket_accept($socket, 0, $remote_address);
        // Thundering herd.
        if (!$new_socket) {
            return;
        }

0是代表非阻塞么?是不时当一个 socket连上来 缓冲区有数据时,才会触发stream_socket_accept,这样是不时阻塞非阻塞没啥区别了。每次aceept都能得到socket

3660 3 0
3个回答

walkor

0非阻塞,设置非阻塞主要是为了读$new_socket时不会阻塞。
当客户端链接上来时,就会触发触发stream_socket_accept。不管缓冲区是否有数据。
stream_socket_accept不一定每次都能得到客户端链接,因为有多个进程同时调用stream_socket_accept接受同一个链接的情况,只有一个能成功。

  • 暂无评论
ayamzh

了解,那如果设置1的话 ,拿不到socket连接时,其他进程就都阻塞住了事件循环 ?

  • 暂无评论
walkor

不会。
设置非阻塞主要是为了读$new_socket时不会阻塞。

  • 暂无评论
年代过于久远,无法发表回答
🔝