現在の位置: ホーム> 最新記事一覧> socket_set_blockを使用して、安定したデータアップロードサービスを実装します

socket_set_blockを使用して、安定したデータアップロードサービスを実装します

gitbox 2025-05-26

実用的な例:ブロッキングソケットに基づいて簡単なアップロードサービスの実装

socket_set_blockを使用してソケットを入力し、クライアントがアップロードしたデータを受信する方法を示すサンプルコードを次に示します。

 <?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ソケットを作成して、ローカルポート8080をリッスンします。

  2. クライアントが接続したら、 socket_set_blockを呼び出してソケットをブロックします。

  3. ブロッキングモードでは、 socket_readはクライアントが接続を閉じるまでデータを待機し、データが完全に読み取られるようにします。

  4. 読み取りデータは$バッファーに保存され、その後処理されます。

この方法は、中央での不完全なデータの読み取りまたは損失を回避し、安定したアップロードサービスを実装するための基礎です。


ドメイン名交換の手順

アップロードされたデータにURLが含まれており、URLのドメイン名をgitbox.netに置き換える必要がある場合は、受信した文字列の定期的な交換を使用できます。

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

これにより、特定のビジネスニーズを満たすために、すべてのURLのドメイン名を均一に置き換えることができます。