Session 是 PHP 開發中維持狀態的核心機制,但新手常遇到路徑設定、Header 錯誤、檔案上傳等問題。本文整理最常見的三大議題並提供解決方案。
預設儲存路徑可能無寫入權限,導致 Session 無法建立。請在 php.ini 中指定可寫入目錄:
session.save_path = "D:/developer/php/temp" ; Windows
session.save_path = "/tmp" ; Linux/Unix
確保該目錄存在且 Web 服務器進程有讀寫權限。
錯誤訊息:Cannot send session cookie - headers already sent
原因:在 session_start() 之前已有輸出(包含空白行、HTML 標籤、echo 等)。
錯誤範例:
<html>
<?php session_start(); ?>
正確寫法:將 session_start() 放在檔案最開頭,任何輸出之前:
<?php session_start(); ?>
<html>...
若專案架構難以調整,可開啟輸出緩衝:ob_start() 在腳本開頭,或在 php.ini 設定 output_buffering = On。
上傳檔案前需在 php.ini 設定臨時目錄:
upload_tmp_dir = "D:/temp" ; Windows
upload_tmp_dir = "/tmp" ; Linux/Unix
並確認 php.ini 中 file_uploads = On、upload_max_filesize 與 post_max_size 符合需求。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1048576">
<input type="file" name="userfile">
<input type="submit" name="upload" value="上傳">
</form>
upload.php 中使用 move_uploaded_file() 而非 copy(),並嚴格驗證檔案類型與大小。