Thực tế là nó sử dụng thư viện mysql không có nghĩa là nó thực hiện một chuyến đi khứ hồi với máy chủ.
Nó chạy mã từ thư viện máy khách mysql, được tải trong cùng một quy trình với trình thông dịch php của bạn. Tuy nhiên, bạn cần có kết nối - chức năng đó cần biết một số cài đặt máy chủ để hoạt động bình thường. Nhưng những cài đặt đó được lưu vào bộ nhớ đệm trong thông tin kết nối ở phía PHP.
Nếu bạn muốn xác minh điều này (và bạn đang sử dụng linux), hãy viết một tập lệnh đơn giản như:
<?php
$link = mysql_connect('localhost', 'user', 'pass');
echo "Connection done\n";
echo mysql_real_escape_string("this ' is a test");
?>
Và chạy nó qua strace
:
$ strace php t.php
.... # here comes the connection to mysql, socket fd == 3
connect(3, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0
fcntl(3, F_SETFL, O_RDWR) = 0
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
.... # talking with mysql here
poll([{fd=3, events=POLLIN}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
read(3, "8\0\0\0\n5.1.58-log\0\3\0\0\0K-?4'fL+\0\377\367!"..., 16384) = 60
...
read(3, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11
# first php echo
write(1, "Connection done\n", 16Connection done ) = 16
# second php echo
write(1, "this \\' is a test", 17this \' is a test) = 17
munmap(0x7f62e187a000, 528384) = 0
....
Điều quan trọng duy nhất ở đó là hai write
do echo
gây ra các câu lệnh không có cuộc gọi tổng hợp nào khác ở giữa - không thể giao tiếp mạng nào mà không có cuộc gọi điện thoại tổng hợp (từ không gian người dùng trong linux).