Walkerman 源代码中关于socket_import_stream疑问

thibaultfu

在Walker类中有如下代码:

 // 尝试打开tcp的keepalive,关闭TCP Nagle算法
 if(function_exists('socket_import_stream'))
 {
     $socket   = socket_import_stream($this->_mainSocket );
     @socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
     @socket_set_option($socket, SOL_SOCKET, TCP_NODELAY, 1);
 }

为何需要在socket_import_stream存在的情况下,设置SO_KEEPALIVE和TCP_NODELAY,不存在就不需要调用么?

另外socket_import_stream访问和传入的$this->_mainSocket的值是一样的,为何还需要再调用一次?

6893 3 0
3个回答

walkor

php提供两种socket:
php提供了两种类型的socket,http://php.net/manual/en/book.stream.phphttp://php.net/manual/en/book.sockets.php,二者api不兼容
stream_socket是php内置的,可以直接使用,并且api和stream 的api通用(可以调用fread fwrite...)。
sockets需要php安装sockets扩展才能使用。

workerman使用stream_socket
为了不依赖扩展加上能让workerman的event-loop同时能操作普通stream资源,workerman使用了php内置的stream_socket。

stream_socket缺点
stream_socket与sockets相比有个缺点,无法精确设置socket选项。当需要设置stream_socket选项时,
可以通过http://php.net/manual/en/function.socket-import-stream.php将stream_socket转换成扩展的sockets,然后就可以通过http://php.net/manual/en/function.socket-set-option.php设置stream_socket的socket选项了。

为何判断socket_import_stream函数是否存在?
由于socket_import_stream属于sockets扩展提供的api,并且php>=5.4才支持,所以要判断下function_exists('socket_import_stream')是否存在,不存在说明扩展没装或者版本不支持,所以不能调用。

  • 暂无评论
颗粒Cc.

他是不是想问如果php5.3及以下版本或者没有安装sockets扩展的话,就无法设置keep_alive,那么后续会代码或者业务照成什么样的影响吗?

感谢boss,我也想了解下哈

walkor

没有多大影响,keep-alive是tcp底层的心跳机制,灵敏度很差,用不用差别不大。

心跳在应用层实现比较好,客户端定时发个空数据给服务端就可以了。

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