2011年12月19日 星期一

Zend Framework 出現 Could not determine temp directory, please specify a cache_dir manually‏ 錯誤訊息

最近使用 Zend_Http_Client,在某些情況下會出現
「 Could not determine temp directory, please specify a cache_dir manually」的錯誤訊息。

後來發現是因為程式沒有讀取  /tmp 資料夾的權限,
因我沒辦法改伺服器的 /tmp 權限,只好由修改程式著手。

本來應該是直接修改 Zend_Cache 的 cache_dir 資料夾設定。
但我只有單一使用 Zend_Http_Client,
沒有自己建立 Zend_Cache 的物件,
Zend_Cache 好像是 Zend_Http_Client 在某些情況下,會自己建立,
但查看 Zend_Http_Client 的API文件,找不到修改 cache_dir 的 method。

後來發現Zend_Cache抓cache資料夾的方法為。(以下程式碼為 Zend Framework 1.11.11 版的內容)
/**
 * Determine system TMP directory and detect if we have read access
 *
 * inspired from Zend_File_Transfer_Adapter_Abstract
 *
 * @return string
 * @throws Zend_Cache_Exception if unable to determine directory
 */
public function getTmpDir()
{
 $tmpdir = array();
 foreach (array($_ENV, $_SERVER) as $tab) {
  foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) {
   if (isset($tab[$key])) {
    if (($key == 'windir') or ($key == 'SystemRoot')) {
     $dir = realpath($tab[$key] . '\\temp');
    } else {
     $dir = realpath($tab[$key]);
    }
    if ($this->_isGoodTmpDir($dir)) {
     return $dir;
    }
   }
  }
 }
 $upload = ini_get('upload_tmp_dir');
 if ($upload) {
  $dir = realpath($upload);
  if ($this->_isGoodTmpDir($dir)) {
   return $dir;
  }
 }
 if (function_exists('sys_get_temp_dir')) {
  $dir = sys_get_temp_dir();
  if ($this->_isGoodTmpDir($dir)) {
   return $dir;
  }
 }
 // Attemp to detect by creating a temporary file
 $tempFile = tempnam(md5(uniqid(rand(), TRUE)), '');
 if ($tempFile) {
  $dir = realpath(dirname($tempFile));
  unlink($tempFile);
  if ($this->_isGoodTmpDir($dir)) {
   return $dir;
  }
 }
 if ($this->_isGoodTmpDir('/tmp')) {
  return '/tmp';
 }
 if ($this->_isGoodTmpDir('\\temp')) {
  return '\\temp';
 }
 Zend_Cache::throwException('Could not determine temp directory, please specify a cache_dir manually');
}

由程式碼可以發現,還有另外幾種方式可以修改cache_dir:
  1. 在$_ENV, $_SERVER的環境變數中,
    設定 TMPDIR、TEMP 、 TMP 、 windir 、 SystemRoot 其中一個的值,
    例如  $_SERVER['TMP'] = '/home/tmp',則  cache_dir 會改成   '/home/tmp'。
  2. 修改 php.ini 的 upload_tmp_dir 設定。
雖然以上兩種方法也可修改 cache_dir 的設定,
但我想應該還有用Zend Framework提供的method來設定的方式,
只是我一時找不到。

沒有留言:

張貼留言