Zend Framework:无法确定临时目录,请手动指定cache_dir

问题描述

|| 我只是在学习Zend Framework。我创建了一个简单的Zend_Form,提交表单时出现以下错误
An error occurred
Application error
Exception information:

Message: Could not determine temp directory,please specify a cache_dir manually
Stack trace:

 - 0 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Cache\\Backend.PHP(197): Zend_Cache::throwException(\'Could not deter...\')
 - 1 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Cache\\Backend\\File.PHP(123): Zend_Cache_Backend->getTmpDir()
 - 2 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Cache.PHP(153): Zend_Cache_Backend_File->__construct(Array)
 - 3 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Cache.PHP(94): Zend_Cache::_makeBackend(\'File\',Array,false,false)
 - 4 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Locale\\Data.PHP(314): Zend_Cache::factory(\'Core\',\'File\',Array)
 - 5 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Locale\\Format.PHP(808): Zend_Locale_Data::getList(\'en_US\',\'day\')
 - 6 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Locale\\Format.PHP(1118): Zend_Locale_Format::_parseDate(\'12/12/2010\',Array)
 - 7 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Date.PHP(4765): Zend_Locale_Format::getDate(\'12/12/2010\',Array)
 - 8 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Validate\\Date.PHP(175): Zend_Date::isDate(\'12/12/2010\',\'MM-DD-YYYY\',NULL)
 - 9 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Form\\Element.PHP(1395): Zend_Validate_Date->isValid(\'12/12/2010\',Array)
 - 10 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Form.PHP(2252): Zend_Form_Element->isValid(\'12/12/2010\',Array)
 - 11 H:\\Documents\\IIS_Server_Root\\localhost\\zfprojects\\zf_cms\\application\\controllers\\BugController.PHP(30): Zend_Form->isValid(Array)
 - 12 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Controller\\Action.PHP(513): BugController->submitaction()
 - 13 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Controller\\dispatcher\\Standard.PHP(295): Zend_Controller_Action->dispatch(\'submitaction\')
 - 14 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Controller\\Front.PHP(954): Zend_Controller_dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http),Object(Zend_Controller_Response_Http))
 - 15 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Application\\Bootstrap\\Bootstrap.PHP(97): Zend_Controller_Front->dispatch()
 - 16 H:\\Documents\\IIS_Server_Root\\zendframework\\Zend\\Application.PHP(366): Zend_Application_Bootstrap_Bootstrap->run()
 - 17 H:\\Documents\\IIS_Server_Root\\localhost\\zfprojects\\zf_cms\\public\\index.PHP(26): Zend_Application->run()
 - 18 {main}  
请求参数:
array (
  \'controller\' => \'bug\',\'action\' => \'submit\',\'module\' => \'default\',\'author\' => \'7676\',\'email\' => \'ankur_gupta555@yahoo.com\',\'date\' => \'12/12/2010\',\'url\' => \'http://blogs.antarjaal.in/takneek/?p=1354\',\'description\' => \'tytytyty t\',\'priority\' => \'low\',\'status\' => \'new\',\'submit\' => \'Submit\',)  
系统配置: Windows 7的 IIS 7.5 PHP 5.3 Zend Framework 1.11.4     

解决方法

好吧,它说
\"Please specify a cache_dir manually\"
这样吧。 参考指南中的示例:
$frontendOptions = array(
   \'lifetime\' => 7200,// cache lifetime of 2 hours
   \'automatic_serialization\' => true
);

$backendOptions = array(
    \'cache_dir\' => \'/path/to/cache\' // Directory where to put the cache files
);

// getting a Zend_Cache_Core object
$cache = Zend_Cache::factory(\'Core\',\'File\',$frontendOptions,$backendOptions);
使用缓存资源插件时等效:
resources.cachemanager.database.frontend.name = Core
resources.cachemanager.database.frontend.customFrontendNaming = false
resources.cachemanager.database.frontend.options.lifetime = 7200
resources.cachemanager.database.frontend.options.automatic_serialization = true

resources.cachemanager.database.backend.name = File
resources.cachemanager.database.backend.customBackendNaming = false
resources.cachemanager.database.backend.options.cache_dir = \"/path/to/cache\"
resources.cachemanager.database.frontendBackendAutoload = false
参考: http://framework.zend.com/manual/zh-CN/zend.cache.backends.html#zend.cache.backends.file http://framework.zend.com/manual/en/zend.cache.introduction.html http://zendframework.com/manual/en/zend.application.available-resources.html     ,查看Zend / Cache / Backend.php代码时,有一些替代方法可以正确猜测cache_dir: 设置环境变量,例如TMPDIR,TEMP或TMP 在php.ini中设置\“ upload_tmp_dir \” 允许访问\“ / tmp \”或\“ \\ temp \” 至少这就是我阅读代码的方式:
/**
 * 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\');
}
    ,这样的事情应该会有所帮助:
$_SERVER[\'TEMP\'] =  realpath(dirname(__FILE__) . \'/tmp\');
    ,我使用的是\'memcached \'而不是\'File \',所以我的问题有点不同。我通过使用以下方法解决了这个问题:
        $registry = Zend_Registry::getInstance ();
        $frontendOptions =
        array (
            \'lifetime\' => APPLICATION_ENV == \'development\' ? \'10\' : \'3600\',\'automatic_serialization\' => true
        );


    $backendOptions = array(
                        \'servers\' => array( array(
                            \'host\' => APPLICATION_ENV == \'development\' ? \'***\' : \'***\',\'port\' => \'***\'
                        ) ),\'compression\' => true
    );

    $cache = Zend_Cache::factory ( \'Core\',\'Memcached\',$backendOptions );

// Below is the fix for the problem! It appears that some validators / translates are caching
Zend_Locale::setCache($cache);
Zend_Translate::setCache($cache);
    ,我已经在对我有用的主目录中创建了“ tmp”文件夹     ,关闭/禁用缓存:)为什么在学习时将其用于简单的应用程序?还有更多重要的事情要学习;)     ,您可以输入.htaccess
SetEnv TEMP /tmp
    ,我认为这解决了问题,它为我解决了
Zend_Date::setOptions(array(\'cache\' => $cache)); // Active aussi pour Zend_Locale
Zend_Translate::setCache($cache);
在bootstrap.php中设置缓存后添加