PHP程序通訊 UNIX Socket
阿新 • • 發佈:2020-07-16
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;