\stream_socket_client $flag STREAM_CLIENT_ASYNC_CONNECT 和 STREAM_CLIENT_CONNECT 区别是什么?

meows
        $this->_socket = \stream_socket_client("{$this->transport}://{$this->_remoteAddress}", $errno, $errstr, 0,
            \STREAM_CLIENT_CONNECT);
  1. 上面的代码会报错,如果设置为 STREAM_CLIENT_ASYNC_CONNECT 连接超时0 就不会报错。
    请问这是为什么???
1948 1 0
1个回答

blogdaren
  1. 首先要区分清楚socket超时概念,一个是指连接超时,另一个是指数据传输超时; 而stream_socket_client()函数的最后两个参数都是针对TCP连接阶段这个生命周期而言的;
  2. 顾名思义最后的位参: STREAM_CLIENT_CONNECT 和 STREAM_CLIENT_ASYNC_CONNECT, 前一个表示发起同步TCP连接,此时$timeout参数配套生效,表示最大经过$timeout秒之后要是建立连接失败或者发生意外,那么就会报告系统级的错误,错误信息保存在($errno, $errstr);后一个刚好相反,表示发起异步连接,这时底层connect()会立即返回并不会报错(此时$timeout参数没啥用),所以之后一旦连接句柄异常,那么读写数据照样会报错,读写超时通过stream_socket_timeout()控制。
年代过于久远,无法发表回答
🔝