在 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 可見:
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)connect(7, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0Socket 原本設計用於網路通訊,後來在其框架上衍生出 Unix Domain Socket 作為行程間通訊 (IPC) 機制。
本質上,IPC 是可靠通訊(核心保證送達),而網路協定是為不可靠通訊設計(需重傳、排序等機制)。Unix Domain Socket 同時提供 串流 (SOCK_STREAM,類 TCP) 與 資料包 (SOCK_DGRAM,類 UDP) 兩種 API,但其資料包模式同樣具備可靠、不丟失、不亂序的特性。
localhost** 以啟用 Unix Domain Socket,獲得最佳效能。127.0.0.1。