0

「safe_mode」がオンになっているサイトにZendFrameworkプロジェクトをアップロードしたいのですが、制御できません。

PHPから次の警告メッセージが表示されます。

PHP警告:realpath()[function.realpath]:セーフモード制限が有効です。uid / gidが954/815のスクリプトは、185行目の/blabla/phpapps/include/library/Zend/Cache/Backend.phpにあるuid /gid0/0が所有する/tmpにアクセスできません。

Zend_Cacheを使用していないのに、safe_modeがスクリプトに腹を立てているのはなぜですか?

このエラーを回避するために、プロジェクトにデフォルトの/ tmpディレクトリを設定するにはどうすればよいですか?

どうも

4

1 に答える 1

1

Zend_Cacheを使用していないのに、safe_modeがスクリプトに腹を立てているのはなぜですか?

Zend_Cache他のいくつかのZFコンポーネント(など)からも内部的に使用されるZend_DbためですZend_Translate

このエラーを回避するために、プロジェクトにデフォルトの/ tmpディレクトリを設定するにはどうすればよいですか?

ここでは2つの選択肢があります。

  1. コンポーネントが使用しているものを追跡し、ストレージZend_Cacheを使用しない定義済みのバックエンドを持つキャッシュのカスタムインスタンスを使用するように構成します( ApcまたはMemcachedを確認してください)/tmp
  2. 185行目近くの実装を見てZend_Cache_Backend、そのエラーを回避するためにコードを更新してください。

オプション1を選択すると、パフォーマンスが向上し(apcまたはmemcachedはファイルシステムよりも高速なストレージです)、プロジェクトで何が起こっているかをより細かく制御できます。ただし、構成する必要のあるコンポーネントが複数ある可能性があるため、プロジェクトで複数の変更が必要になる可能性があります。

オプション2を選択すると、1回の変更ですべてをハッキングでき、デフォルトのキャッシュインスタンスを使用するすべてのコンポーネントが反映されますが、コードをハッキングして内部実装で動作するため、ZFの将来のリリースでコードが破損する可能性があります。つまり、ZFがチェックするキーの1つを使用して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';
于 2011-08-22T13:09:40.497 に答える