Ограничение безопасного режима PHP для Zend Framework - PullRequest
0 голосов
/ 19 августа 2011

Я хочу загрузить проект Zend Framework на сайт, где включено «safe_mode», и я не могу его контролировать.

Я получаю следующее предупреждающее сообщение от PHP:

PHP Предупреждение: realpath () [function.realpath]: БЕЗОПАСНЫЙ РЕЖИМ Действующее ограничение.Скрипт с uid / gid 954/815 не имеет доступа к / tmp, принадлежащему uid / gid 0/0 в /blabla/phpapps/include/library/Zend/Cache/Backend.php в строке 185

Я не использую Zend_Cache, так почему safe_mode раздражает мой скрипт?

Как мне установить каталог по умолчанию / tmp в моем проекте, чтобы избежать этой ошибки?

thx

1 Ответ

1 голос
/ 22 августа 2011

Я не использую 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 могут сломать ваш код.Тем не менее, вы можете достичь этого, определив переменную ENV или SERVER с помощью одного из ключей, который проверяет ZF.Вот строки, перед которыми выдается предупреждение:

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