0

我想将 Zend 框架项目上传到“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 目录以避免此错误?

谢谢

4

1 回答 1

1

我不使用 Zend_Cache,为什么 safe_mode 对我的脚本生气?

因为Zend_Cache也被其他一些 ZF 组件( 等)在内部Zend_Db使用Zend_Translate

如何在我的项目中设置默认 /tmp 目录以避免此错误?

您在这里有两个选择:

  1. 跟踪使用的组件Zend_Cache并将其配置为使用自定义的缓存实例,该实例具有不使用/tmp存储的已定义后端(检查Apc 或 Memcached
  2. 查看Zend_Cache_Backend第 185 行附近的实现并更新您的代码以避免该错误。

我会选择选项 1 以获得更好的性能(apc 或 memcached 的存储速度比文件系统快)并且可以更好地控制项目中发生的事情。但是,这可能需要对您的项目进行多次更改,因为可能需要配置多个组件。

如果您选择选项 2,您可以通过一次更改来破解整个事情,它将反映使用默认缓存实例的所有组件,但是由于您破解您的代码以使用内部实现,ZF 的未来版本可能会破坏您的代码。也就是说,您可以通过使用 ZF 检查的键之一定义一个ENVor变量来实现此目的。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';
于 2011-08-22T13:09:40.497 回答