ZF1 + phpbb 3.1.5 - проблемы с $cache->get

Сайт с ZF1, который ведет на форум phpbb.
Обновление phpbb с 3.0.12 до 3.1.5 (этой проблемы не было в 3.0.12)

Форум работает нормально, когда я обращаюсь к нему напрямую.

Однако при доступе к нему через фреймворк
(например, для доступа к пользовательским функциям, таким как data['user_unread_privmsg'])
я получаю следующую ошибку:

Call to undefined method Zend_Cache_Core::get() in /forum/phpbb/db/driver/mysqli.php on line 119

Я выполнил это с помощью xe-debug, и он останавливается на следующей функции:

/**
    * {@inheritDoc}
    */
    function sql_server_info($raw = false, $use_cache = true)
    {
        global $cache;

        if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version'))  === false)
        {
            $result = @mysqli_query($this->db_connect_id, 'SELECT VERSION() AS version');
            if ($result !== null)
            {
                $row = @mysqli_fetch_assoc($result);

                $this->sql_server_version = $row['version'];

                if (!empty($cache) && $use_cache)
                {
                    $cache->put('mysqli_version', $this->sql_server_version);
                }
            }
            @mysqli_free_result($result);
        }

        return ($raw) ? $this->sql_server_version : 'MySQL(i) ' . $this->sql_server_version;
    }

точная строка, вызывающая ошибку, следующая
if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version')) === false)

моя настройка кеша ZF (которая хорошо работает для других элементов кеша) выглядит так

$cachedir = APPLICATION_PATH . '/public/tmp/cache';

    if (!is_dir($cachedir)) {
        mkdir($cachedir, 0755, true);       // make directory if it doesn't exist
    }

    $frontendOptions = array(
        'lifetime' => 600,
        'automatic_serialization' => true
    );

    $backendOptions = array(
        'cache_dir' => $cachedir
    ); 

    // getting a Zend_Cache_Core object
    $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

    Zend_Registry::set("cache", $cache);
    Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

    $cache = Zend_Cache::factory('Core', 'APC', $frontendOptions);
    Zend_Registry::set("apc_cache", $cache);

Любые идеи, как обойти эту проблему?

(Я удалил старый кеш, установил права tmp/cache на 777 и т. д.)


person goredwards    schedule 29.07.2015    source источник


Ответы (1)


phpBB использует переменную $cache в глобальной области видимости (импортируя ее в области функций с помощью global $cache). Это должен быть экземпляр класса кэша phpBB, а не класса Zend_Cache_Core.

Фактически, назначив это:

$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

вы перезаписываете установленную здесь глобальную переменную: https://github.com/phpbb/phpbb/blob/3.1.x/phpBB/includes/compatibility_globals.php и все взрывается.

phpBB3 не подходил для включения вместе с другим скриптом и совместного использования той же области и памяти. В последнее время стало намного лучше (и, как вы видите, связанный файл называется compatability), но все же вы должны быть осторожны и кодировать осторожно.

person vvondra    schedule 29.07.2015
comment
спасибо, полезно знать - изменил имя моей настройки кеша ZF на $appCache, что устранило проблему! - person goredwards; 29.07.2015