在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
的值是一样的,为何还需要再调用一次?
php提供两种socket:
php提供了两种类型的socket,http://php.net/manual/en/book.stream.php 和 http://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')是否存在,不存在说明扩展没装或者版本不支持,所以不能调用。
他是不是想问如果php5.3及以下版本或者没有安装sockets扩展的话,就无法设置keep_alive,那么后续会代码或者业务照成什么样的影响吗?
感谢boss,我也想了解下哈
没有影响
没有多大影响,keep-alive是tcp底层的心跳机制,灵敏度很差,用不用差别不大。
心跳在应用层实现比较好,客户端定时发个空数据给服务端就可以了。