问题描述
||
我只是在学习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中设置缓存后添加