Domanda

Sto tentando di estendere la parte Crawler del modulo Enterprise pagecache, però, sto ottenendo il seguente errore, credo che abbia a che fare con la linea di $ this -> _ init ( 'vmr_crawler / crawler'); trovato nel mio modello, dico questo perché se passo fuori vmr_crawler, con enterprise_pagecache, funziona ... Ecco l'errore

Fatal error: Call to a member function getUrlsPaths() on a non-object in /jlr/sites/mage/app/code/local/VMR/Crawler/Model/Crawler.php on line 37

Tutte le idee, frammenti, i commenti sono molto apprezzate! Grazie mille, sto inviando tutto il mio codice qui sotto.

Il mio modulo di configurazione

app/etc/modules/VMR_Crawler.xml

Il mio modulo di codice di configurazione

<?xml version="1.0"?>
<config>
<modules>
    <VMR_Crawler>
        <active>true</active>
        <codePool>local</codePool>
        <depends>
            <Mage_Core/>
        </depends>
    </VMR_Crawler>
</modules>

Il mio Config

app/code/local/VMR/Crawler/etc/config.xml

Il mio Config Codice

<?xml version="1.0"?>
<config>
<modules>
    <VMR_Crawler>
        <version>0.0.1</version>
    </VMR_Crawler>
</modules>
<global>
    <models>
        <vmr_crawler>
            <class>VMR_Crawler_Model</class>
            <resourceModel>vmr_crawler_resource</resourceModel>
        </vmr_crawler>
        <vmr_crawler_resource>
            <class>VMR_Crawler_Model_Resource</class>
        </vmr_crawler_resource>
        <pagecache>
            <rewrite>
                <crawler>VMR_Crawler_Model_Crawler</crawler>
            </rewrite>
        </pagecache>
        <pagecache_resource_crawler>
            <rewrite>
                <attribute>VMR_Crawler_Model_Resource_Crawler</attribute>
            </rewrite>
        </pagecache_resource_crawler>
    </models>
</global>
</config> 

Il mio modello

app/code/local/VMR/Crawler/Model/Crawler.php

Il mio Codice Modello

<?php

class VMR_Crawler_Model_Crawler extends Enterprise_PageCache_Model_Crawler
{
protected function _construct()
{
    $this->_init('vmr_crawler/crawler');
}

public function crawl()
{
    if (!Mage::app()->useCache('full_page')) {
        return $this;
    }
    $storesInfo  = $this->getStoresInfo();
    $adapter     = new Varien_Http_Adapter_Curl();

    foreach ($storesInfo as $info) {
        $options = array(CURLOPT_USERAGENT => self::USER_AGENT);
        $storeId = $info['store_id'];
        $this->_visitedUrls = array();

        if (!Mage::app()->getStore($storeId)->getConfig(self::XML_PATH_CRAWLER_ENABLED)) {
            continue;
        }

        $threads = (int)Mage::app()->getStore($storeId)->getConfig(self::XML_PATH_CRAWLER_THREADS);
        if (!$threads) {
            $threads = 1;
        }
        if (!empty($info['cookie'])) {
            $options[CURLOPT_COOKIE] = $info['cookie'];
        }
        $urls       = array();
        $baseUrl    = $info['base_url'];
        $urlsCount  = $totalCount = 0;
        $urlsPaths  = $this->_getResource()->getUrlsPaths($storeId);
        foreach ($urlsPaths as $urlPath) {
            $url = $baseUrl . $urlPath;
            $urlHash = md5($url);
            if (isset($this->_visitedUrls[$urlHash])) {
                continue;
            }
            $urls[] = $url;
            $this->_visitedUrls[$urlHash] = true;
            $urlsCount++;
            $totalCount++;
            if ($urlsCount == $threads) {
                $adapter->multiRequest($urls, $options);
                $urlsCount = 0;
                $urls = array();
            }
        }
        if (!empty($urls)) {
            $adapter->multiRequest($urls, $options);
        }
    }
    return $this;
}
}

Il mio Modello di risorse

app/code/local/VMR/Crawler/Model/Resource/Crawler.php

La mia risorsa Modello Codice

<?php

class VMR_Crawler_Model_Resource_Crawler extends Enterprise_PageCache_Model_Resource_Crawler
{
    /**
     * Retrieve URLs paths that must be visited by crawler
     *
     * @param  $storeId
     * @return array
     */
    public function getUrlsPaths($storeId)
    {
        $bWorked = false;
        $collection = array();
        for($i = 0; $i < 3; $i++) 
        {
            echo "hi";
            try {
                $adapter = $this->_getReadAdapter();
                $select = $adapter->select()
                    ->from($this->getTable('core/url_rewrite'), array('request_path'))
                    ->where('store_id=?', $storeId)
                    ->where('is_system=1');
                $collection = $adapter->fetchCol($select);
                $bWorked = true;
            } 
            catch(Exception $ex)
            {

            }

            if($bWorked == true)
            {
                break;
            }
        }

        return $collection;
    }
}

Il mio Modello di risorse MySQL4 Classe

app/code/local/VMR/Crawler/Model/Mysql4/Crawler.php

Il mio Modello di risorse MySQL4 Codice Classe

<?php

class VMR_Crawler_Model_Mysql4_Crawler extends Enterprise_PageCache_Model_Resource_Crawler
{

}

Il mio Shell Class Testing Per

shell/crawler.php

Il mio Shell Classe Per testare il codice

<?php
/**
 * Full Page Cache Warming Shell Script
 *
 * @author Jeffrey L. Roberts
 **/

require_once 'abstract.php';

class Mage_Shell_Crawler extends Mage_Shell_Abstract
{
    /**
     * Run script
     *
     */
    public function run()
    {
        // echo "Starting Crawler";

        $crawler = new VMR_Crawler_Model_Crawler();
        $crawler->crawl();

        // echo "Crawler finished";
    }

    /**
     * Retrieve Usage Help Message
     *
     */
    public function usageHelp()
    {
        return <<<USAGE
Usage:  php -f crawler.php 

USAGE;
    }
}

$shell = new Mage_Shell_Crawler();
$shell->run(); 

Per eseguire la shell

cd shell
php -f crawler.php
È stato utile?

Soluzione

salto nel buio qui, come il tuo post è un po 'denso e non sono sicuro che ho visto chiunque si estendono sia una risorsa di modello e l'override del metodo _construct in entrambi, ma la linea 37 che PHP si lamenta sguardi di essere

$urlsPaths  = $this->_getResource()->getUrlsPaths($storeId);

che è sostenuta dal vostro messaggio di errore

Fatal error: Call to a member function getUrlsPaths() on a non-object in /jlr/sites/mage/app/code/local/VMR/Crawler/Model/Crawler.php on line 37

Quindi Magento sta cercando di creare un'istanza di risorsa del tuo modello, ma non può. Quindi, se siete alla ricerca di un punto di partenza, provate a tracciare il percorso del codice di

$o = Mage::getModelResource('vmr_crawler/crawler');

e determinare il motivo per cui la sua falsa ritorno.

A poche congetture su quella. In primo luogo, di aver incluso un

<deprecatedNode>vmr_crawler_mysql4</deprecatedNode>

ma non hanno alcun nodo vmr_crawler_mysql4 nel file XML. Perché è questo qui?

In secondo luogo, il vostro modello di risorse per il crawler sembra essere l'inizializzazione con un core/url_rewrite?

protected function _construct()
{
    $this->_init('core/url_rewrite', 'url_rewrite_id');
}

Non sono sicuro di quello che dovrebbe fare, ma sembra fuori (poi di nuovo, io non sono esattamente chiaro su ciò che si sta cercando di fare qui, e non ho alcuna versione Enterprise disponibili al momento)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top