2010-09-06 9 views
0

J'ai un client avec un magasin de Magento. Ils créent un fichier txt à télécharger sur googlebase, qui contient tous leurs produits, mais en raison de la quantité de produits (20k), le script bombe une fois qu'il a pris environ 1gb. C'est en cours d'exécution via cron.très grand tableau de fichier en PHP

est-il un moyen de zip soit ou segmenter le tableau, ou écrire dans le fichier tel qu'il est créé, plutôt que de créer le tableau, puis l'écrire?

<?php 
define('SAVE_FEED_LOCATION','/home/public_html/export/googlebase/google_base_feed_cron.txt'); 



set_time_limit(0); 

require_once '/home/public_html/app/Mage.php'; 
    Mage::app('default'); 

try{ 
    $handle = fopen(SAVE_FEED_LOCATION, 'w'); 


    $heading = array('id','title','description','link','image_link','price','product_type','condition','c:product_code'); 
    $feed_line=implode("\t", $heading)."\r\n"; 
    fwrite($handle, $feed_line); 

    $products = Mage::getModel('catalog/product')->getCollection(); 
    $products->addAttributeToFilter('status', 1);//enabled 
    $products->addAttributeToFilter('visibility', 4);//catalog, search 
    $products->addAttributeToFilter('type_id', 'simple');//simple only (until fix is made) 
    $products->addAttributeToSelect('*'); 
    $prodIds=$products->getAllIds(); 

    foreach($prodIds as $productId) { 

     $product = Mage::getModel('catalog/product'); 

     $product->load($productId); 

     $product_data = array(); 
     $product_data['sku']=$product->getSku(); 
     $product_data['title']=$product->getName(); 
     $product_data['description']=$product->getShortDescription(); 
     $product_data['link']=$product->getProductUrl(). '?source=googleps'; 
     $product_data['image_link']=Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage(); 

     // Get price of item 
if($product->getSpecialPrice()) 
      $product_data['price']=$product->getSpecialPrice(); 
     else 
    $product_data['price']=$product->getPrice(); 


     $product_data['product_type']=''; 
     $product_data['condition']='new'; 
     $product_data['c:product_code']=$product_data['sku']; 


     foreach($product->getCategoryIds() as $_categoryId){ 
      $category = Mage::getModel('catalog/category')->load($_categoryId); 
      $product_data['product_type'].=$category->getName().', '; 
     } 
     $product_data['product_type']=rtrim($product_data['product_type'],', '); 



     //sanitize data 
     foreach($product_data as $k=>$val){ 
     $bad=array('"',"\r\n","\n","\r","\t"); 
     $good=array(""," "," "," ",""); 
     $product_data[$k] = '"'.str_replace($bad,$good,$val).'"'; 
     } 


     $feed_line = implode("\t", $product_data)."\r\n"; 
     fwrite($handle, $feed_line); 
     fflush($handle); 
    } 

    //---------------------- WRITE THE FEED 
    fclose($handle); 

} 
catch(Exception $e){ 
    die($e->getMessage()); 
} 

>

+1

Où exactement se casse-t-il et avec quel message d'erreur? Chaque produit est immédiatement écrit dans le fichier, ce qui ne devrait pas poser de problème. –

+0

Bon point! Combien a-t-il écrit au moment de l'accident? Le problème pourrait-il être de charger les données plutôt que de les écrire? –

+1

Espace disque libre, quota utilisateur, version PHP, etc. Je suspecte une fuite de mémoire dans le modèle. Essayez PHP 5.3 si vous ne pouvez pas effacer les références circulaires. –

Répondre

0

J'ai deux réponses rapides ici:

1) Essayez d'augmenter la taille de la mémoire maximale autorisée de php (pour la ligne de commande, car il est un script cron)

2) la façon dont les développeurs supérieurs à résoudre des problèmes similaires, où je travaille actuellement est quelque chose comme ce qui suit:

Créer un attribut de champ de date avec un nom comme googlebase_uploa ded, et exécutez le script cron avec quelque chose comme const MAX_PRODUCTS_TO_WRITE. Ajoutez ensuite au fichier et marquez chaque produit ajouté.

Ce que je suis en train de dire est tranche le temps d'exécution en morceaux plus lents qui ne cassera pas le script.

Malheureusement c'est là que je manque java et C#

Questions connexes