mysql_connect()中的localhost和127.0.0.1有什么区别?

60
  1. 在使用mysql_connect()时,使用localhost比使用127.0.0.1连接速度更快吗?
  2. PHP脚本与MySQL之间的连接类型是什么(使用mysql_connect()函数时)?是TCP/IP协议吗?
7个回答

83
  1. Windows和Linux之间存在差异。如果您使用Unix域套接字,它的速度将比使用TCP/IP略快(因为您拥有更少的开销)。
  2. Windows默认使用TCP/IP,而Linux则尝试使用Unix域套接字(如果选择localhost)和TCP/IP(如果选择127.0.0.1)。

13
在Linux中的一个讨厌的事情是当你指定主机名为“localhost”和特定端口时,它会忽略整个端口部分并使用默认套接字。这不是在单台计算机上运行多个服务器时所希望的结果(因此需要使用不同的端口..)。 - Wrikken
1
@Wrikken,这是真的,但可以通过使用127.0.0.1:端口轻松避免。 - halfdan
3
@halfdan:确实,但在开始拆除一些桌子之前,有些事情是人们需要知道的 :P 哎呀,活着就是学习,那是一段时间以前的事情,但我永远不会忘记。 - Wrikken
2
@djangofan:不是吧?127.1不是一个有效的IP地址。它可能作为数据库驱动程序的备用方案。 - halfdan
在Windows 10和11中,使用127.0.0.1明显更快! - Johntor
显示剩余3条评论

21

"localhost" 意味着本地套接字连接,而 127.0.0.1 是TCP/IP。是的,套接字比 TCP/IP 更快。

引用自 http://pl.php.net/mysql_connect

无论你指定 "localhost" 还是 "localhost:port" 作为服务器,MySQL 客户端库都会覆盖它并尝试连接到本地套接字(在 Windows 上是命名管道)。如果你想使用 TCP/IP,请使用"127.0.0.1"代替"localhost"。如果 MySQL 客户端库尝试连接到错误的本地套接字,则应该在 PHP 配置中设置正确的路径,并留空服务器字段。


10
TCP/IP 也是基于套接字(socket)的。我知道你的意思,但这样说会让人们感到困惑。 - halfdan
2
它可以是“Unix套接字连接”。 - helios
你是正确的。我把它改为“本地套接字”以澄清。谢谢你注意到了。 - Piotr Pankowski

17

不要使用localhost,建议使用127.0.0.1,因为Windows 7在IPv6和IPv4之间选择出现了问题。我尝试过,如果我使用localhost,页面需要重新加载约1秒钟(1.04秒),而当我使用127.0.0.1时,页面只需要重新加载50毫秒。这两者都是在Windows 7下使用的。
在Windows XP中使用无差别。


1
有同样的经历。从localhost切换到127.0.0.1,我的延迟从1秒降至5毫秒。谢谢! - Nathan Bedford
1
这是因为Windows在后续版本中从hosts文件中删除了localhost,因此解析需要很长时间。 - Nimeshka Srimal

2

对于Unix系统,在/etc/mysql/my.cnf文件中的[client]块后添加以下行:

protocol=tcp

0

Php网站提示:

注意:

无论何时您指定服务器为“localhost”或“localhost:port”,MySQL客户端库都会覆盖此并尝试连接到本地套接字(Windows上的命名管道)。如果要使用TCP / IP,请改用“127.0.0.1”而不是“localhost”。如果MySQL客户端库尝试连接到错误的本地套接字,则应在PHP配置中设置正确的路径并将服务器字段留空。

我猜速度差异应该很小,这不是你应该担心的事情。


0

本地主机并不比其他主机更快,反而可能稍微慢一些。

话虽如此,如果你要连接到别人的主机,明白我的意思吗?

谁能说哪一端的连接更容易失败呢?没有人知道。这就是为什么:

127.0.0.1 的 ping 比 localhost 更快。在任何终端上都可以试试。


对于 @Php 网站来说没什么实质性的区别,但我们不能就此放弃! - 0b00000001

0

对于 Mac,以下是解决方案:

在 MAC 上使用 localhost 而不是 127.0.0.1 连接到 MySQL。很长一段时间以来,我一直使用 127.0.0.1 在我的开发平台上连接到 MySQL,因为由于某种原因 localhost 不起作用。结果是因为 127.0.0.1 使用 TCP/IP,而 localhost 使用 sockets。php.ini 文件指向了错误的 mysql.sock 位置,所以你只需要更改它,重新启动 apache,就可以解决问题了!

Open php.ini: /private/etc/php.ini
Find the following line: mysql.default_socket = /var/mysql/mysql.sock
Replace with: mysql.default_socket = /tmp/mysql.sock
Restart apache: apachectl restart

注意:如果您没有php.ini文件,则需要复制提供的默认文件php.ini.default。
sudo cp /private/etc/php.ini.default /private/etc/php.ini

通过http://madproject.com/general/connect-to-mysql-using-localhost-instead-of-127-0-0-1-on-a-mac/连接MySQL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接