2010-09-06 44 views
0

我有一個Magento商店的客戶端。他們正在創建一個txt文件上傳到包含他們所有產品的googlebase,但由於產品數量(20k),劇本一旦佔用大約1GB就會炸燬。它正在通過cron運行。在PHP中寫入非常大的數組以存入文件

有沒有辦法壓縮或分割數組,或將它寫入文件,因爲它創建,而不是創建數組,然後寫它?

<?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

它究竟在哪裏破壞和什麼錯誤信息?每個產品都會立即寫入文件,所以這不應該成爲問題。 – 2010-09-06 08:16:49

+0

好點!它在撞車時寫了多少?問題是在加載數據而不是寫入數據? – 2010-09-06 08:23:55

+1

可用磁盤空間,用戶配額,PHP版本等?我懷疑模型中有內存泄漏。如果您無法清除循環引用,請嘗試PHP 5.3。 – 2010-09-06 08:48:55

回答

0

我有兩個快速的答案在這裏:

1)儘量提高PHP的允許最大內存大小(在命令行,因爲它是一個cron腳本)

2)高級開發人員解決類似問題的方式,我目前的工作方式如下所示:

創建一個名稱爲googlebase_uploa的日期字段屬性ded,並運行類似於const MAX_PRODUCTS_TO_WRITE的cron腳本。 然後附加到文件並標記每個附加產品。

我想說的是將執行時間分成不會破壞腳本的慢塊。

不幸的是,我錯過了java和c#