我想向您尋求幫助,因為我有一個關于 rust 中的 unix 套接字的問題。我想嘗試連接到php-fpmrust 中的服務(我在 Linux 機器上),我想我可以連接,但我該如何與之互動?讓我解釋一下我的意思,這是我的代碼:
use std::os::unix::net::{UnixStream};
use std::io::{Read, Write};
fn main() {
let socket_path = "/run/php-fpm/php-fpm.sock";
let mut socket = match UnixStream::connect(socket_path) {
Ok(sock) => sock,
Err(e) => {
println!("Couldn't connect: {e:?}");
return
}
};
}
上面的代碼完美運行。但是我怎樣才能開始使用它呢?我的意思是可能從套接字執行 php 檔案,獲取它們的輸出或程式回傳的標頭以及類似的東西。幾天來我一直在尋找方法,但我找不到方法,我找到了可以做到這一點的庫,但它們對我沒有用,比如這個庫(作為一個例子,使用那個庫我不知道如何獲取程式的“標題”)。你知道有什么方法可以開始使用該套接字并開始處理來自同一個套接字的 php 檔案嗎?提前致謝。
編輯
我一直在閱讀Jmb傳遞給我的鏈接,我想我更了解它是如何作業的,但現在我有一個與主要問題非常相似的問題。我如何傳遞資料?例如,我如何告訴套接字我要發送FCGI_BEGIN_REQUEST,因為如果我理解正確,Web 服務器是必須發送它的服務器,而不是套接字,我認為我可以從其余的請求。我在問“如何”知道應該如何做,因為例如,我認為不應該這樣做:
socket.write(b"FCGI_BEGIN_REQUEST")
這只是一個非常模糊的例子,但我認為它反映了我在說什么。我希望你能幫助我并告訴我應該如何通過套接字寫入資料。最后,如果我對它們的作業方式有誤解,如果您也告訴我,我將不勝感激,以便我糾正我的問題。
uj5u.com熱心網友回復:
fastcgi 協議在此處指定。如果您不想使用現有庫,則需要通過您的套接字自己實作它。FastCGI 是一種二進制協議,其中訊息在第 8 節中指定,就好像它們是 C 結構一樣。例如FCGI_BEGIN_REQUEST,規范的相關部分是:
typedef struct {
unsigned char version;
unsigned char type;
unsigned char requestIdB1;
unsigned char requestIdB0;
unsigned char contentLengthB1;
unsigned char contentLengthB0;
unsigned char paddingLength;
unsigned char reserved;
} FCGI_Header;
#define FCGI_VERSION_1 1
#define FCGI_BEGIN_REQUEST 1
typedef struct {
unsigned char roleB1;
unsigned char roleB0;
unsigned char flags;
unsigned char reserved[5];
} FCGI_BeginRequestBody;
typedef struct {
FCGI_Header header;
FCGI_BeginRequestBody body;
} FCGI_BeginRequestRecord;
#define FCGI_RESPONDER 1
#define FCGI_AUTHORIZER 2
#define FCGI_FILTER 3
這意味著FCGI_BEGIN_REQUEST訊息應該作為 16 位元組的資料塊發送,例如:
const FCGI_VERSION_1: u8 = 1;
const FCGI_BEGIN_REQUEST:u8 = 1;
const FCGI_RESPONDER: u16 = 1;
const FCGI_AUTHORIZER: u16 = 2;
const FCGI_FILTER: u16 = 3;
let requestId = 0x1234; // Change for each request
let role = FCGI_RESPONDER;
let beginRequest = vec![
// FCGI_Header
FCGI_VERSION_1, FCGI_BEGIN_REQUEST,
(requestId >> 8) as u8, (requestId & 0xFF) as u8,
0x00, 0x08, // This is the size of `FCGI_BeginRequestBody`
0, 0,
// FCGI_BeginRequestBody
(role >> 8) as u8, (role & 0xFF) as u8,
0, // Flags
0, 0, 0, 0, 0, // Reserved
];
socket.write_all (&beginRequest).unwrap();
請求正文通常使用一條或多FCGI_STDIN條訊息發送,即:
let contentLength = data.len();
assert!(contentLength <= u16::MAX); // TODO: split the content if it is too large
let requestHeader = vec![
FCGI_VERSION_1, FCGI_STDIN,
(requestId >> 8) as u8, (requestId & 0xFF) as u8,
(contentLength >> 8) as u8, (contentLength & 0xFF) as u8,
0, 0,
];
socket.write_all (&requestHeader).unwrap();
socket.write_all (&data).unwrap();
fastcgicrate實作了協議的應用程式端。您可以查看其源代碼以獲取有關如何實作 Web 服務器端的靈感。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512344.html
標籤:php插座锈
下一篇:UDP客戶端未收到回應
