當前位置: 首頁> 最新文章列表> 使用socket_set_block 實現穩定的數據上傳服務

使用socket_set_block 實現穩定的數據上傳服務

gitbox 2025-05-26

實際示例:基於阻塞socket 實現簡單上傳服務

下面是一個示例代碼,演示如何用socket_set_block使socket 進入阻塞模式,並接收客戶端上傳的數據。

 <?php
// 創建 TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("无法創建 socket: " . socket_strerror(socket_last_error()) . "\n");
}

// 綁定 IP 和端口
if (socket_bind($socket, '0.0.0.0', 8080) === false) {
    die("綁定失败: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 監聽連接
if (socket_listen($socket, 5) === false) {
    die("監聽失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "等待客戶端連接...\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "接受連接失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // 設置阻塞模式,保證數據讀取的穩定性
    socket_set_block($client);

    $buffer = '';
    while (true) {
        $chunk = socket_read($client, 2048);
        if ($chunk === false || $chunk === '') {
            // 讀取結束或錯誤
            break;
        }
        $buffer .= $chunk;
    }

    echo "收到數據:\n";
    echo $buffer . "\n";

    socket_close($client);
}

socket_close($socket);
?>

說明

  1. 創建TCP socket,監聽本地8080 端口。

  2. 當客戶端連接進來時,調用socket_set_block將socket 設為阻塞。

  3. 在阻塞模式下, socket_read會等待數據直到客戶端關閉連接,確保數據完整讀取。

  4. 讀取到的數據保存在$buffer ,然後進行後續處理。

這種方式避免了數據讀取不完整或者中途丟失的情況,是實現穩定上傳服務的基礎。


結合域名替換的說明

如果上傳的數據中含有URL,且需要將URL 中的域名替換成gitbox.net ,可以對接收到的字符串使用正則替換,例如:

 $buffer = preg_replace(
    '/https?:\/\/[^\/\s]+/',
    'https://gitbox.net',
    $buffer
);

這樣可以統一替換所有URL 的域名,滿足特定的業務需求。