在共享主機或受限環境部署 PHPExcel 導出功能時,常遇到 open_basedir restriction in effect. File(/tmp) is not within the allowed path(s) 錯誤。原因是 PHPExcel 內部呼叫 sys_get_temp_dir() 獲取系統臨時目錄(通常為 /tmp),但該目錄不在 open_basedir 允許路徑內。
Warning: realpath() [function.realpath]: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/data/home:/usr/home:/data/home/tmp:...) in /.../Classes/PHPExcel/Shared/File.php on line 136
編輯 Classes/PHPExcel/Shared/File.php,找到 sys_get_temp_dir() 方法(約第 136 行),替換為以下代碼,優先使用 PHP 配置的 upload_tmp_dir,再嘗試環境變數,最後回退到當前腳本目錄下的 tmp 資料夾:
public static function sys_get_temp_dir() {
// 1. 優先使用 php.ini 設定的 upload_tmp_dir
if (ini_get('upload_tmp_dir')) {
$temp = ini_get('upload_tmp_dir');
if (file_exists($temp)) return realpath($temp);
}
// 2. 嘗試系統環境變數
foreach (['TMP', 'TEMP', 'TMPDIR'] as $env) {
if (($temp = getenv($env)) && file_exists($temp)) {
return realpath($temp);
}
}
// 3. 回退:當前腳本目錄下的 tmp 資料夾(需可寫)
$fallback = __DIR__ . '/../../../tmp'; // 根據實際結構調整
if (!file_exists($fallback)) {
mkdir($fallback, 0755, true);
}
return realpath($fallback);
}
; php.ini open_basedir = "/data/home/:/usr/home/:/data/home/tmp:/usr/home/tmp:/tmp:/var/www/disablesite" ; 將 /tmp 加入允許路徑
PHPExcel 官方已停止維護(2017 年歸檔),建議新專案直接使用 PhpSpreadsheet,它是 PHPExcel 的官方繼任者,支援 PHP 7.1+、命名空間、PSR-4、更多格式且修復了大量已知問題。
composer require phpoffice/phpspreadsheet