我不使用 Zend_Cache,为什么 safe_mode 对我的脚本生气?
因为Zend_Cache
也被其他一些 ZF 组件( 等)在内部Zend_Db
使用Zend_Translate
。
如何在我的项目中设置默认 /tmp 目录以避免此错误?
您在这里有两个选择:
- 跟踪使用的组件
Zend_Cache
并将其配置为使用自定义的缓存实例,该实例具有不使用/tmp
存储的已定义后端(检查Apc 或 Memcached)
- 查看
Zend_Cache_Backend
第 185 行附近的实现并更新您的代码以避免该错误。
我会选择选项 1 以获得更好的性能(apc 或 memcached 的存储速度比文件系统快)并且可以更好地控制项目中发生的事情。但是,这可能需要对您的项目进行多次更改,因为可能需要配置多个组件。
如果您选择选项 2,您可以通过一次更改来破解整个事情,它将反映使用默认缓存实例的所有组件,但是由于您破解您的代码以使用内部实现,ZF 的未来版本可能会破坏您的代码。也就是说,您可以通过使用 ZF 检查的键之一定义一个ENV
or变量来实现此目的。SERVER
这些是发出警告之前的行:
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;
}
}
}
}
因此,引导程序中这样的代码将解决您的问题:
// I assume you're using the default ZF project structure
// and that your-root/data/tmp is both writable and readable for
// the webserver user, because the _isGoodTmpDir method will check for that
$_SERVER['TMP'] = APPLICATION_PATH . '/../data/tmp';