词语解释:
Framework:SwooleFramework,测试的时候是使用它查询一个用户,语句 select * from user where UserName ='abc' limit 1。
Host=localhost.port:port是有具体值,比如localhost:22518,它表示连接到自己客户端的端口号,这里统一使用port代替。带有port的连接,证明是通过TCP连接的,而通过socket连接的,只有localhost,后面没有端口port。
host文件作用大家应该不陌生,主要作用是域名和IP做映射。无论win还是linux,初始安装后一般默认就为localhost和127.0.0.1之间做了映射,你可以修改它,但不建议。所以通常情况下,你使用localhost的时候,会先通过查找host,查找到映射的IP,再利用IP做最后连接使用。
偶然看到一篇博文,http://blog.csdn.net/xifeijian/article/details/12879395,说其使用localhost比127.0.0.1更好,当时颠覆了自己的认识,认为是错误的,还做出反论证的评论。其实这篇博文说的点没有错,只是说得很不详细和没有加上特定条件,所以本人今天特别较真,在这里特别继续做了测试和总结。
一、使用ping命令,或者浏览器等应用,localhost首先是经过host文件映射配置,得到IP,然后再使用IP做后续使用的。
修改host文件前:
[root@localhost /]# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=23 ttl=64 time=0.169 ms
64 bytes from localhost (127.0.0.1): icmp_seq=24 ttl=64 time=0.050 ms
64 bytes from localhost (127.0.0.1): icmp_seq=25 ttl=64 time=0.093 ms
64 bytes from localhost (127.0.0.1): icmp_seq=26 ttl=64 time=0.091 ms
[root@localhost /]# ping localhost
PING localhost (127.0.0.2) 56(84) bytes of data.
64 bytes from localhost (127.0.0.2): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from localhost (127.0.0.2): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from localhost (127.0.0.2): icmp_seq=3 ttl=64 time=0.049 ms
64 bytes from localhost (127.0.0.2): icmp_seq=4 ttl=64 time=0.050 ms
二、MySQL在*nix系统上连接方式有两种,分别是Socket和Tcp/ip方式,Win下应该只有TCP方式,不作考证,下面只是在Centos7下面做测试的结果。(惭愧!说做开发也有7年了,居然不了解MySQL的Socket连接方式,只是看到过这配置,没多注意它的作用。)
首先使用命令ifconfig,会看到两块网卡在工作:
[root@localhost /]# ifconfig
ens33: flags=4163 mtu 1500
inet 10.0.0.19 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe23:ccb prefixlen 64 scopeid 0x20
ether 00:0c:29:23:0c:cb txqueuelen 1000 (Ethernet)
RX packets 27050 bytes 2920042 (2.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10918 bytes 5431431 (5.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 547 bytes 106047 (103.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 547 bytes 106047 (103.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33 是正常对外的网卡,lo网卡是系统回环网卡,注意它的ip就是127.0.0.1,我们正好可以测试lo网卡的开启和关闭状态下的mysql连接,更好的反证明mysql的socket连接作用。
前提环境:mysql.user表中数据
Host User
127.0.0.1 root
localhost root
% root
a)ifconfig lo up状态下,使用mysql的默认配置(/etc/my.cnf里面配置为空)。what the hell?可以看到mysql命令使用socket正常连接,而Framework只能使用TCP连接,为什么不能正常使用localhost的socket连接呢?且看下一步。
mysql -uroot -p 命令 :正常连接 show full processlist;Host=localhost
Framework配置localhost :连接错误
Framework配置127.0.0.1 :正常连接 show full processlist;Host=localhost.port
b)ifconfig lo up状态下,配置/etc/my.cnf如下,也不知道哪个参数影响了,没具体测试。
[client]
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
[mysqld]
socket=/tmp/mysql.sock
[mysqld_safe]
[mysqladmin]
socket=/tmp/mysql.sock
这时候测试连接结果如下,可以看到mysql命令和Framework使用localhost,都可以正常使用socket连接,而Framework配置127.0.0.1的时候,依然是使用TCP连接。
mysql -uroot -p 命令 :正常连接 show full processlist;Host=localhost
Framework配置localhost :正常连接 show full processlist;Host=localhost
Framework配置127.0.0.1 :正常连接 show full processlist;Host=localhost.port
mysql -uroot -p 命令 :正常连接 show full processlist;Host=localhost
Framework配置localhost :正常连接 show full processlist;Host=localhost
Framework配置127.0.0.1 :连接错误
mysql -uroot -p 命令 :正常连接 show full processlist;Host=localhost
Framework配置localhost :连接错误
Framework配置127.0.0.1 :连接错误
总结:MySQL有两种连接方式:TCP和Socket,mysql使命不指定-h选项的时候,不管/etc/my.cnf是否正确配置,也不管lo网卡是否正常使用,它都可以使用Socket方式连接使用MySQL数据库。Framework若要使用配置localhost来使用Socket连接,就需要正确配置/etc/my.cnf,但同样可以不管lo网卡是否正常使用。MySQL配置使用localhost的时候是使用Socketl连接,不需要经任何网卡,连接速度应该是比127.0.0.1更快的,这点是和其它应用不同之处。
但是使用localhost到底能快多少不得而知,它的使用需要正确配置数据库,否则导致一些莫名的问题而查不到原因。而使用127.0.0.1在速度上应该差不了多少,它只要lo网卡正常使用即可使用,产生的问题比较少。大家可以根据自己情况选择使用。