首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Socket 實現檔案上傳:伺服器端與客戶端完整範例

     編輯:PHP 相關知識

概述

除了常見的 HTTP POST 上傳,PHP 也可使用 Socket 直接傳輸檔案。本文提供伺服器端監聽與客戶端發送的完整範例,適用於特殊場景(如內部系統檔案同步、避開 HTTP 限制等)。

伺服器端代碼

<?php
set_time_limit(10);
// error_reporting(0); // 生產環境建議開啟錯誤記錄而非關閉

function varinfo($str) {
    echo "<pre>";
    var_dump($str);
    echo "</pre>";
}

$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

if ($socket) {
    $result = socket_bind($socket, '192.168.3.57', 1337);
    if ($result) {
        $result = socket_listen($socket, 5);
        if ($result) {
            echo "監聽成功\n";
        }
    }
} else {
    echo "監聽失敗\n";
}

$path = "e://web//"; // 檔案儲存路徑

while (true) {
    $connection = socket_accept($socket);
    if ($connection) {
        $msg = "telnet succeed!\r\n";
        socket_write($connection, $msg, strlen($msg));

        $buffer = '';
        $fp = null;

        while ($flag = socket_recv($connection, $buffer, 1024, 0)) {
            if (false !== strpos($buffer, 'filename:')) {
                $filename = substr($buffer, 9); // 取得檔名
                $filename = $path . $filename;
                $fp = fopen($filename, "wb");
                continue;
            }
            if ($fp) {
                fwrite($fp, $buffer);
            }
        }
        if ($fp) fclose($fp);
        socket_close($connection);
    }
}
socket_close($socket);
?>

客戶端代碼

<?php
$errno = '001';
$errstr = "socket file error";

$fp = fsockopen("192.168.3.57", 1337, $errno, $errstr, 10);
if (!$fp) {
    echo "$errstr ($errno)\n";
} else {
    $str = "filename:socket_file.bmp";
    fwrite($fp, $str);
    $out = file_get_contents('../../iphone3G.bmp'); // 讀取要上傳的檔案
    if ($out) {
        fwrite($fp, $out);
        fwrite($fp, 'over'); // 結束標記
        echo "上傳成功\n";
    }
}
fclose($fp);
?>

關鍵點與注意事項

  • 協議簡易化:範例以 filename: 開頭傳遞檔名,以 over 結尾標記傳輸結束,實際應用建議設計更健壯的協議(如長度前綴、JSON 標頭、校驗碼)。
  • 二進位模式:fopen($filename, "wb") 確保 Windows 下正確寫入二進位檔案。
  • 錯誤處理:生產環境需加入連線超時、傳輸中斷重試、檔案完整性驗證(MD5/SHA1)。
  • 安全性:Socket 端口暴露於網路需配合防火牆限制存取來源,避免未授權上傳。
  • 效能考量:大檔案傳輸建議啟用非阻塞 I/O(socket_set_nonblock())搭配 socket_select() 多路複用。

適用場景

  • 內網高速檔案同步/備份
  • 嵌入式裝置無 HTTP 協議棧時的檔案上傳
  • 需繞過 Web 伺服器上傳大小限制(如 upload_max_filesize、post_max_size)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved