【问题标题】:PHP Safe Mode Restriction for Zend FrameworkZend 框架的 PHP 安全模式限制
【发布时间】:2011-08-19 16:14:15
【问题描述】:

我想将 Zend 框架项目上传到“安全模式”已开启但我无法控制的站点。

我从 PHP 收到以下警告消息:

PHP 警告:realpath() [function.realpath]:安全模式限制生效。 uid/gid 为 954/815 的脚本不允许访问 /blabla/phpapps/include/library/Zend/Cache/Backend.php 第 185 行中 uid/gid 0/0 拥有的 /tmp

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

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

谢谢

【问题讨论】:

    标签: php zend-framework safe-mode


    【解决方案1】:

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

    因为Zend_Cache 也从其他一些 ZF 组件(Zend_DbZend_Translate 等)内部使用。

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

    你有两个选择:

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

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

    如果您选择选项 2,您可以通过一次更改来破解整个事情,它将反映使用默认缓存实例的所有组件,但是由于您破解您的代码以使用内部实现,ZF 的未来版本可能会中断你的代码。也就是说,您可以通过使用 ZF 检查的键之一定义 ENVSERVER 变量来实现此目的。这些是发出警告之前的行:

    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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2010-11-16
      相关资源
      最近更新 更多