zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    DOM getElementById
    百度之星2014
    游艇租借
    2014年acm亚洲区域赛·鞍山站
    UVALive 4255 Guess
    UVA 10054 The Necklace
    UVA 10047 The Monocycle
    UVA 11624 Fire!
    第九届黑龙江省赛
    剑指offer系列31-----二叉树的下一个节点
  • 原文地址:https://www.cnblogs.com/xiangshihua/p/13324283.html
Copyright © 2011-2022 走看看