Magento - 尝试获取缩略图时的内存错误

时间:2014-07-23 21:15:29

标签: php magento

编辑:我正在使用Magento 1.6.2(社区)

我想迭代产品。我运行以下代码(虽然这不是一个完整的文件,它是SOAP服务的类定义的一部分 - 这里没有描述的方法对我的问题不重要):

//ok
private function _listProductData($product, $full = false)
{
    $result = array(
        //_getProductAttribute($product, $attribute)
        'product_id'  => $product->getId(),
        'type'        => $product->getTypeId(),
        'position'    => $product->getCatIndexPosition(),
        'sku'         => $product->getSku(),
        'price'       => $this->_getProductAttribute($product, 'price'),
        'kilometraje' => $this->_getProductAttribute($product, 'kilometraje'),
        'thumbnail'   => Mage::helper('catalog/image')->init($product, 'thumbnail'),
        'model'       => $this->_getProductModel($product)
    );

    if ($full)
    {
        //meter mas datos
        $result = $result + array(
            'image' => $this->_getProductAttribute($product, 'small_image'),
            'tipo_vehiculo' => $this->_getProductAttribute($product, 'vehiculo_tipo', true),
            'cilindrada' => $this->_getProductAttribute($product, 'cilindrada', true),
            'combustible' => $this->_getProductAttribute($product, 'combustible', true),
            'transmision' => $this->_getProductAttribute($product, 'transmision', true),
            'direccion' => $this->_getProductAttribute($product, 'direccion', true),
            'traccion' => $this->_getProductAttribute($product, 'traccion', true),
            'anio' => $this->_getProductAttribute($product, 'rango_anio', true),
            'tapiz' => $this->_getProductAttribute($product, 'tapiz', true),
            'aire_acondicionado' => $this->_getProductAttribute($product, 'aire_acondicionado', true),
            'vidrios' => $this->_getProductAttribute($product, 'vidrios', true),
            'origen' => $this->_getProductAttribute($product, 'origen', true),
            'numero_placa' => $this->_getProductAttribute($product, 'numero_placa', true),
            'placa' => $this->_getProductAttribute($product, 'placa')
        );
    }

    //$result = array();
    //foreach ($product->getTypeInstance(true)->getEditableAttributes($product) as $attribute) {
    //    if ($this->_isAllowedAttribute($attribute, $attributes)) {
    //        $result[$attribute->getAttributeCode()] = $product->getData($attribute->getAttributeCode());
    //    }
    //}
    return $result;
}

//ok
private function _listProductCollection($collection, $offset, $order)
{
    //ordenamos y nos quedamos con un cachito de la coleccion nomas
    $order = in_array($order, array('ASC', 'DESC', false)) ? $order : false;
    $order ? $collection->setOrder('name', $order) : false;
    $collection->setPage($offset, 10);
    //iteramos y recolectamos los datos (TO-DO listar los atributos y la imagen principal)
    $result = array();
    foreach ($collection as $product) {
        $result[] = $this->_listProductData($product, false);
    }

    return $result;
}

//ok
public function listVehicles($categoryId=null, $offset=1, $order='ASC')
{
    $categoryId = (int) $categoryId;
    $offset = (int) $offset;

    if (($categoryId < 1) || ($offset < 1) || !in_array($order, array('DESC', 'ASC'))) {
        $this->_fault('bad_params');
    }

    //cargamos categoria actual, y store actual (1).
    //la categoria no puede ser de una rama que no sea Marcas o Tipos.
    //si eso pasa, o la categoria no existe, tiramos un 404.
    $category = $this->_initCategory($categoryId, 1);
    $parentId = $category->getParentId();
    if (!in_array($parentId, array(4, 94))) {
        $this->_fault('category_not_exists');
    }
    //tratamos su lista de resultado.
    return $this->_listProductCollection($category->setStoreId($storeId = 1)->getProductCollection()->addAttributeToSelect('*'), $offset, $order);
}

要获取每个单独项目的图片,我曾经让行$this->_getProductAttribute($product, 'thumbnail'),但它返回了一个相对网址:/p/c/pcd0748-1.jpg(仅限说明网址)。

当我试图获取完整的url时,通过知道它的基本url所以我只需要附加块,我发现这样的基本url不是那么“稳定”(即不是一个众所周知的文件夹结构,而是一些东西与缓存有关):

http://www.blablabla.com/media/catalog/product/cache/1/small_image/201x201/17f82f742ffe127f42dca9de82fb58b1/p/c/pcd0748-1.jpg

所以我不能简单地将那个长网址作为基本网址,因为哈希 - 常识告诉我们这个基本网址会改变。

所以我将图像检索行更改为当前给定的(Mage::helper('catalog/image')->init($product, 'thumbnail'),我收到了内存错误(我得到了10个产品的子集,所以这样的行运行共10次)。

Fatal error: Allowed memory size of 314572800 bytes exhausted (tried to allocate 295698398 bytes) ...(10张图片为295MB !!!)

是否有一种更高效的方式,不会因为10张图像而扼杀我的记忆?我知道这样的图像存在,只是想得到图像网址。

1 个答案:

答案 0 :(得分:0)

解决方案:

Mage::helper('catalog/image')->init($product, 'thumbnail')

这不会返回一个URL,而是一个非常复杂的对象,它有一个指向产品模型对象的指针。并且这样的对象具有指向对象的巨大链(或树)的指针,其总计这样的存储量。序列化这样的对象会要求很多MB。

要仅获取网址,必须将对象转换为字符串:

(string) Mage::helper('catalog/image')->init($product, 'thumbnail')

这只会有url - 这是我对序列化的期望。