首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

MySQL 連線:localhost 與 127.0.0.1 的差異解析(網路層面)

     編輯:PHP 綜合知識

前言

在 PHP 中使用 mysql_connect 連接 MySQL 時,指定主機為 localhost 或 127.0.0.1 雖然都指向本機,但底層通訊機制卻大相逕庭。本文透過 strace 追蹤系統呼叫,深入剖析兩者的差異與效能影響。

測試環境與程式碼

<?php
// connects.php
mysql_connect('127.0.0.1','root','zzzizzz1');
mysql_connect('localhost','root','zzzizzz1');
?>

系統呼叫追蹤結果

執行 strace php connects.php 2>&1 | grep connect 可見:

  • 127.0.0.1 → 使用 Internet Socket (TCP/IP)
    connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
  • localhost → 使用 Unix Domain Socket (IPC)
    connect(7, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0

核心差異:Unix Domain Socket vs. Network Socket

Socket 原本設計用於網路通訊,後來在其框架上衍生出 Unix Domain Socket 作為行程間通訊 (IPC) 機制。

  • Network Socket (127.0.0.1):資料需經過完整的網路協定堆疊(封包/解封包、校驗和、序號維護、ACK 機制等),即使走 loopback 介面仍有額外開銷。
  • Unix Domain Socket (localhost):直接在核心層將應用層資料從一個行程複製到另一個行程,完全繞過網路協定堆疊,無封包解封、無校驗和、無序號管理,因此 IPC 效率顯著更高。

為什麼 Unix Domain Socket 更高效?

本質上,IPC 是可靠通訊(核心保證送達),而網路協定是為不可靠通訊設計(需重傳、排序等機制)。Unix Domain Socket 同時提供 串流 (SOCK_STREAM,類 TCP) 與 資料包 (SOCK_DGRAM,類 UDP) 兩種 API,但其資料包模式同樣具備可靠、不丟失、不亂序的特性。

結論與建議

  • 本機連線 MySQL 時,**優先使用 localhost** 以啟用 Unix Domain Socket,獲得最佳效能。
  • 若需強制使用 TCP/IP(如連線非預設埠、穿透防火牆、或 Docker 容器間通訊),再指定 127.0.0.1。
  • 在高併發場景下,減少協定堆疊開銷可顯著降低 CPU 使用率與延遲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved