我想将Zend Framework项目上传到“safe_mode”所在的网站,我无法控制它。
我从PHP收到以下警告消息:
PHP警告:realpath()[function.realpath]:安全模式限制生效。 uid / gid为954/815的脚本不允许在第185行的/blabla/phpapps/include/library/Zend/Cache/Backend.php中访问uid / gid 0/0所拥有的/ tmp
我不使用Zend_Cache,为什么safe_mode对我的脚本感到生气?
如何在项目中设置默认/ tmp目录以避免此错误?
THX
答案 0 :(得分:1)
我不使用Zend_Cache,为什么safe_mode对我的脚本感到生气?
因为Zend_Cache
也在内部使用来自其他一些ZF组件(Zend_Db
,Zend_Translate
等)。
如何在项目中设置默认/ tmp目录以避免此错误?
你有两个选择:
Zend_Cache
并将其配置为使用自定义缓存实例,其中定义的后端不使用/tmp
存储(检查Apc or Memcached)Zend_Cache_Backend
实施并更新您的代码以避免该错误。我会选择选项1以获得更好的性能(apc或memcached是比文件系统更快的存储),并且可以更好地控制项目中发生的事情。但是,这可能需要对项目进行多次更改,因为可能需要配置多个组件。
如果您选择选项2,您可以通过一次更改来破解整个事情,它将反映使用默认缓存实例的所有组件,但是因为您的代码被黑客攻击以使用内部实现ZF的未来版本可能会破坏你的代码。也就是说,您可以通过使用ZF检查的其中一个键定义ENV
或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';