不是你想像的简单!配置mysql连接方式的时候,localhost和127.0.0.1的区别。

词语解释:

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

修改host文件后:

[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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        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


c)ifconfig lo down状态下,/etc/my.cnf保持步骤b的配置。可以看到就算禁用了lo网卡,mysql命令和Framework依然可以使用socket方式正常连接使用mysql数据库,但是使用127.0.0.1连接不正常,它依靠lo网卡。

mysql -uroot -p 命令		:正常连接		show full processlist;Host=localhost
Framework配置localhost		:正常连接		show full processlist;Host=localhost
Framework配置127.0.0.1		:连接错误


d)在步骤c的前提下,/etc/my.cnf配置清空,可以看到,就算Framework可以使用socket连接,但需要正确配置mysql的配置文件,否则使用出现意想不到的问题。
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网卡正常使用即可使用,产生的问题比较少。大家可以根据自己情况选择使用。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值