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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM