Walkerman 源代码中关于socket_import_stream疑问

0

在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的值是一样的,为何还需要再调用一次?

已邀请:

walkor

赞同来自: Qmore泽 yaxiaomu

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')是否存在,不存在说明扩展没装或者版本不支持,所以不能调用。

walkor

赞同来自: Qmore泽

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


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

匿名用户

匿名用户

赞同来自:

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


感谢boss,我也想了解下哈

要回复问题请先登录注册