當前位置: 首頁> 最新文章列表> PHP 頁面重定向前怎樣用ob_get_contents() 獲取頁面完整內容?操作方法詳解

PHP 頁面重定向前怎樣用ob_get_contents() 獲取頁面完整內容?操作方法詳解

gitbox 2025-08-23
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
 * 本示例僅用於演示,前面部分與文章內容無關
 * 可以在這裡放置任意 PHP 初始化邏輯
 */</span>

</span><span><span class="hljs-variable">$start_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// 記錄腳本開始時間</span></span><span>

</span><span><span class="hljs-comment">// 模擬一些和文章無關的代碼</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">dummy_log</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$message</span></span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'dummy.log'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>) . </span><span><span class="hljs-string">' - '</span></span><span> . </span><span><span class="hljs-variable">$message</span></span><span> . PHP_EOL, FILE_APPEND);
}

</span><span><span class="hljs-title function_ invoke__">dummy_log</span></span><span>(</span><span><span class="hljs-string">"訪問了文章頁面"</span></span><span>);

</span><span><span class="hljs-meta">?&gt;</span></span><span>
&lt;hr&gt;
</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * PHP 頁面重定向前怎樣用 ob_get_contents() 獲取頁面完整內容?操作方法詳解
 *
 * 在 PHP 開發中,我們有時需要在執行 header('Location: ...') 進行重定向之前,
 * 先獲取當前頁面的完整輸出內容進行保存或分析,這時候就可以用到輸出緩衝區函數
 * ob_get_contents()。
 *
 * 一、為什麼要用輸出緩衝?
 * -----------------------
 * 在 PHP 中,通常內容是直接輸出給瀏覽器的,一旦輸出後,PHP 就不能再修改已經發送的頭信息,
 * 這會導致在調用 header() 進行重定向時出現 “headers already sent” 的錯誤。
 * 使用輸出緩衝(Output Buffering)可以讓 PHP 將輸出暫存到內存中,這樣我們既能讀取它,
 * 又能在發送給瀏覽器前做處理。
 *
 * 二、ob_get_contents() 的作用
 * --------------------------
 * ob_get_contents() 用於獲取當前輸出緩衝區的內容。前提是必須已經用 ob_start() 開啟了輸出緩衝。
 *
 * 三、操作方法步驟
 * ----------------
 * 1. 在頁面最開始調用 ob_start() 開啟緩衝區。
 * 2. 編寫頁面內容,這些內容會被暫存到緩衝區而不是直接輸出。
 * 3. 調用 ob_get_contents() 獲取緩衝區裡的內容。
 * 4. 在獲取內容後,可以將其保存到文件、資料庫,或者進行分析處理。
 * 5. 最后調用 ob_end_clean() 或 ob_end_flush():
 *    - ob_end_clean():清空緩衝區內容,不輸出到瀏覽器。
 *    - ob_end_flush():輸出緩衝區內容到瀏覽器。
 * 6. 在清理緩衝區後執行 header('Location: ...') 進行重定向。
 *
 * 四、示例代碼
 * ------------
 * 以下示例展示瞭如何在重定向前獲取頁面內容並保存到文件:
 */</span>

</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 1. 開啟緩衝區</span></span><span>

</span><span><span class="hljs-comment">// 2. 模擬頁面輸出</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;h1&gt;歡迎訪問本站&lt;/h1&gt;"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;p&gt;這裡是頁面正文內容。&lt;/p&gt;"</span></span><span>;

</span><span><span class="hljs-comment">// 3. 獲取緩衝區內容</span></span><span>
</span><span><span class="hljs-variable">$pageContent</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_contents</span></span><span>();

</span><span><span class="hljs-comment">// 4. 保存內容到文件</span></span><span>
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'page_backup.html'</span></span><span>, </span><span><span class="hljs-variable">$pageContent</span></span><span>);

</span><span><span class="hljs-comment">// 5. 清理緩衝區</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>();

</span><span><span class="hljs-comment">// 6. 執行重定向</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Location: https://www.example.com"</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;

<span class="hljs-comment">/**
 * 五、注意事項
 * ------------
 * - 必须在任何实际输出前調用 ob_start(),否則緩衝區無法捕獲內容。
 * - 如果 header() 重定向前已經有輸出,且未開啟緩衝,會報錯。
 * - 保存的內容僅包含當前 PHP 腳本輸出,不會包含外部資源(如 CSS、JS、圖片)。
 *
 * 總結:
 * -----
 * ob_get_contents() 是在 PHP 頁面重定向前獲取輸出內容的實用工具。
 * 搭配 ob_start()、ob_end_clean() 等函數,可以在不影響 HTTP 頭的情況下,
 * 完整捕獲頁面內容用於備份或處理,非常適合日誌記錄、調試和緩存等場景。
 */</span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>