2013-04-02 5 views
0

я использовал 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) Я m не используя это, а только загруженную версию от 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

Я не знаком с этой библиотекой, но в общем, вы можете узнать, где именно происходит ошибка registering a shutdown function и печатать последнюю ошибку.

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

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, если вам нравится, хотя оба из них будут никогда не улавливать фатальную ошибку (среди других сбоев).

+0

Спасибо за этот фрагмент, я уверен, что это пригодится рано или поздно. Я думаю, что у меня были некоторые столкновения с именами методов ... изменение вещей вокруг и небольшая оптимизация избавились от него. Не знаю, хотя. – Phix

Смежные вопросы