PHP进程通信 UNIX Socket

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;

 

PHP进程通信 UNIX Socket

上一篇:使用SignalR asp.net core通信 (二)使用分组


下一篇:html中

标签的各种属性介绍_table的使用