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

PHP 模擬 ASP Response 類:統一輸出、重定向與 Gzip 壓縮

     編輯:PHP 綜合知識

設計目標

ASP/ASP.NET 開發者習慣使用 Response 對象統一管理 HTTP 響應。本類在 PHP 中復刻核心功能:Header 管理、輸出緩衝、重定向、Gzip 壓縮,提供熟悉的開發體驗。

完整類實現

final class Response {
    private $headers = [];
    private $output = '';
    private $compressLevel = 0;

    public function addHeader($key, $value) {
        $this->headers[$key] = $value;
        return $this;
    }

    public function removeHeader($key) {
        unset($this->headers[$key]);
        return $this;
    }

    public function redirect($url) {
        header('Location: ' . $url);
        exit;
    }

    public function setOutput($output, $compressLevel = 0) {
        $this->output = $output;
        $this->compressLevel = (int)$compressLevel;
        return $this;
    }

    private function compress($data, $level) {
        if (headers_sent()) return $data;
        if (connection_status() !== 0) return $data;
        if (!extension_loaded('zlib') || ini_get('zlib.output_compression')) return $data;

        $encoding = false;
        if (!empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
            if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) $encoding = 'gzip';
            elseif (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'x-gzip') !== false) $encoding = 'x-gzip';
        }
        if (!$encoding) return $data;

        $this->addHeader('Content-Encoding', $encoding);
        return gzencode($data, $level);
    }

    public function output() {
        $out = $this->compressLevel ? $this->compress($this->output, $this->compressLevel) : $this->output;

        if (!headers_sent()) {
            foreach ($this->headers as $k => $v) {
                header("$k: $v");
            }
        }
        echo $out;
    }

    // 便捷靜態方法
    public static function json($data, $code = 200) {
        $resp = new self();
        $resp->addHeader('Content-Type', 'application/json; charset=utf-8')
             ->setOutput(json_encode($data, JSON_UNESCAPED_UNICODE))
             ->output();
        http_response_code($code);
        exit;
    }

    public static function xml($xmlString, $code = 200) {
        $resp = new self();
        $resp->addHeader('Content-Type', 'application/xml; charset=utf-8')
             ->setOutput($xmlString)
             ->output();
        http_response_code($code);
        exit;
    }
}

使用示例

基礎頁面輸出

$resp = new Response();
$resp->addHeader('X-Powered-By', 'MyFramework')
     ->setOutput('

Hello World

', 6) // 級別 6 壓縮 ->output();

API 統一返回

try {
    $user = User::find($id);
    Response::json(['code' => 0, 'data' => $user]);
} catch (Exception $e) {
    Response::json(['code' => 500, 'msg' => $e->getMessage()], 500);
}

文件下載

$resp = new Response();
$resp->addHeader('Content-Type', 'application/octet-stream')
     ->addHeader('Content-Disposition', 'attachment; filename="export.csv"')
     ->addHeader('Content-Transfer-Encoding', 'binary')
     ->setOutput($csvData)
     ->output();

核心特性對比

功能ASP Response本類實現
Write/WriteLine直接輸出緩衝至 setOutput() 最後統一 output()
RedirectResponse.Redirectredirect() 同樣 exit
BufferResponse.Buffer = True默認啟用(內部緩衝)
GzipIIS 級別配置運行時動態判斷 Accept-Encoding
Expires/CacheControl屬性設置通過 addHeader() 手動設置

注意事項

  1. 必須在輸出前調用:任何 echo、空白輸出、header() 都會導致 headers_sent() 為真,壓縮與 Header 設置失效。
  2. 單例模式更適合框架集成:可改為單例,在框架入口初始化,控制器通過 Response::instance() 獲取。
  3. PHP 內置 zlib.output_compression 衝突:類中已檢測並跳過雙重壓縮。
  4. 大文件下載:不建議用 setOutput 載入整個文件到內存,應改用 readfile() 或流式輸出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved