Неустранимая ошибка выделения памяти WURFL

Я использовал WURFL просто отлично, а потом вдруг выдает эту ошибку:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65484 bytes) in /var/wwwlibs/vnd/WURFL/lib/CustomDevice.php on line 118

В Интернете я нашел кое-что о Tera-WURFL, но (afaik) я им не пользуюсь, а просто скачал версию с sourceforge. Кто-то предложил обновить SimpleXML, но я просто запутался, почему WURFL идет слишком высоко.

Мой класс-обёртка выглядит следующим образом:

<?php
namespace vnd\WURFL;

use \WURFL_Configuration_InMemoryConfig;
use \WURFL_WURFLManagerFactory;
/**
 * File: WURFL_bootstrap.php
 * Sets up and readies the WURFL library for platform and browser detection.
 */
require_once 'WURFL/lib/Application.php';

// ----- WURFL constants ------ //
define('WURFL_ROOT', dirname(__FILE__).'/');

# Directories
define('WURFL_RESOURCES_DIR',     WURFL_ROOT.'resources/');
define('WURFL_PERSISTENCE_DIR', WURFL_RESOURCES_DIR.'storage/persistence');
define('WURFL_CACHE_DIR',         WURFL_RESOURCES_DIR.'storage/cache');

class WURFLBootstrap extends WURFL_Configuration_InMemoryConfig {    
    const WURFL_WATCH_MODE = "performance";
    const WURFL_VERSION = '2.3.3';
    const WURFL_CACHE_EXP = 36000;

    # Our WURFL Manager
    private $_manager;

    # Our device where the capabilities lie
    private $_device;

    public function __construct(){
        $zipPath = $this->getPath();

        if(!is_file($zipPath))
            die($zipPath.' is not a valid file.');
        if(!is_dir(WURFL_PERSISTENCE_DIR) || !is_dir(WURFL_CACHE_DIR))
            die(WURFL_PERSISTENCE_DIR.' or '.WURFL_CACHE_DIR.' are not valid directories.');

        $this->wurflFile($zipPath);
        $this->matchMode(self::WURFL_WATCH_MODE);

        $this->persistence('file', array('dir' => WURFL_PERSISTENCE_DIR));
        $this->cache('file',        array('dir' => WURFL_CACHE_DIR, 'expiration' => self::WURFL_CACHE_EXP));

        // Automatically reload the WURFL data if it changes
        $this->allowReload(true);

        // Create a WURFL Manager Factory from the WURFL Configuration
        $wurflManagerFactory = new WURFL_WURFLManagerFactory($this);

        // Create our factory and start the process.
        $this->_device = $wurflManagerFactory->create()->getDeviceForHttpRequest($_SERVER);
    }
    /**
     * Returns the path to our ZIP file 
     */
    private function getPath(){
        return WURFL_RESOURCES_DIR.'/wurfl-'.self::WURFL_VERSION.'.zip';
    }
    /**
     * Seeing as this is a wrapper class, any calls to our $wflManager (or whatever
     * we happened to be assigned to) should be passed on to the actual
     * manager object where all the goodies lie.
     * 
     */
    public function __call($name, $arguments){
        //return $this->device->$name($arguments);
    }
    public function getDevice(){
        return $this->_device;
    }
}

Компьютер, на котором он работает, - это старый ноутбук, так что на нем нет памяти, но что дает? Я удалил все, что могло вызвать чрезмерное распределение памяти, но пока что кажется, что WURFL просто не хочет работать.

Я также попытался очистить каталоги кеша и персистентности и запустить его снова, но без кубиков.

Одна вещь, которую я думаю, это использовать класс конфигурации XML, в отличие от WURFL_Configuration_InMemoryConfig (основываясь на названии, я предполагаю, что оно хранит все в памяти, по крайней мере временно, отсюда и сбой), но мне любопытно, почему это внезапно выдает эту ошибку.

1 ответ

Я не знаком с этой библиотекой, но в целом вы можете точно определить, где что-то идет не так, зарегистрировав функцию выключения и напечатав последнюю ошибку там.

Добавьте следующий фрагмент кода где-то в начале вашего скрипта (т.е. до того, как произойдет ошибка):

function my_shutdown_function() {
  echo "SHUTDOWN!\n";
  $err = error_get_last();
  if($err) {
    print_r($err);

    // optionally, if you want a stack trace:
    $ex = new Exception;
    print_r($ex->getTraceAsString());
  }
}

register_shutdown_function('my_shutdown_function');

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

Другие вопросы по тегам