AF_UNIX所代表的UNIX本地socket方式。当然了人家是先有socket后有这种UNIX Socket,这玩意也是后来满满发展来的,你可以理解为一开始socket是面向跨机器的网络通信,后来发现这玩意纯用在本地搞搞单机版跨进程通信效果也贼不错,而且这种本地版本的socket跑在127.0.0.1地址上,你别看是socket然而实际上一不经过网卡、二也没有网络协议解析那些乱七八糟的,这是一种可靠的连接服务。
其实有些老哥在折腾MySQL的时候应该注意到了,一个叫做mysql.sock的文件;或者折腾php-fpm与Nginx的时候,有个php-fpm.sock。一般约定俗成的话,这种后缀为sock的文件就是UNIX本地socket。
拿php-fpm里这个sock来说,当你把Nginx服务器与php-fpm部署在同一台机器上的时候,你完全可以考虑使用本地socket的方式让Nginx与php-fpm进行数据交换,很明显这种省略掉网络开销的通信方式应该是更高效的,不过我曾经在网上看到过一个中论调,大概是说「php-fpm这种unix socket通信方式不稳定」而且还感染了相当一批人,但是通篇也没有看到这种论调的论据是什么:
言论自由没问题,言论是否要负责呢?
如果你知道这种「不稳定」的原因,可以后台提供一下,我下篇文章打补丁。
由于前面我们说过socket相关的操作函数,所以下面的demo你们看起来应该是不费吹灰之力的,但是你们一定要把注意力分配到注释上:
/*********** 一侧代码 **********/ <?php $listen_socket = socket_create( AF_UNIX, SOCK_STREAM, 0 ); // 这会儿就不需要把socket bind到IP+PORT上了 // 而是bind到一个sock文件上 $file = "./server.sock"; socket_bind( $listen_socket, $file ); socket_listen( $listen_socket ); while ( true ) { $connection_socket = socket_accept( $listen_socket ); $ret = socket_recv( $connection_socket, $recv_content, 2048, 0 ); echo $recv_content; $encode_ret = "higood"; socket_write( $connection_socket, $encode_ret, strlen( $encode_ret ) ); } /*********** 另一侧代码 **********/ <?php $conn_socket = socket_create( AF_UNIX, SOCK_STREAM, 0 ); $file = "./server.sock"; socket_connect( $conn_socket, $file ); socket_write( $conn_socket, "HI,I am coming." ); socket_recv( $conn_socket, $recv_content, 2048, 0 ); echo $recv_content;