2010-08-26 22 views
2

我忙於CakePHP中的一個項目,我需要解析幾個XML文件並在mysql數據庫中插入相關數據。腳本插入它應該插入的內容,這不是問題。例如,如果我解析一個或兩個文件(大約7000-8000條記錄),沒有任何問題。腳本在一段時間後重新啓動

問題從我解析第三個或第四個xml文件開始。插入記錄一分鐘後,我看到9000-10000個記錄已成功插入到數據庫中,但突然間腳本似乎重新啓動。我注意到表中存在0條記錄,它將重新插入所有記錄。所以這個腳本只是花了很長時間才能執行。

一小段:

$content = simplexml_load_file($file); 

/** 
* Process line per line 
*/    
foreach ($content->product as $line) {    
    // create new record in products database table 
    $product = array(); 
    $product['Product']['productid'] = $line->attributes()->sku_number; 
    $product['Product']['name'] = $line->attributes()->name; 
    $product['Product']['description'] = empty($line->description->long) ? $line->description->short : $line->description->long; 
    $product['Product']['link'] = $line->URL->product; 
    $product['Product']['affiliate'] = 'linkshare'; 
    $product['Product']['price'] = $line->price->retail; 
    $product['Product']['brand'] = strtolower($line->brand); 
    $product['Product']['image'] = $line->URL->productImage; 

    // if not in rejectedproducts, save the new product to the database 
    if (!$rejectedproductModel->findByProductid($product['Product']['productid'])) { 
    $productModel->create(); 
    $productModel->save($product);   
} 

有人得到這方面的經驗?可能是什麼原因和更多什麼可能是一個解決方案:)

謝謝

+0

你是如何傳遞這些文件的?所以當添加文件1和2時,你添加文件3和4時重新添加它們?或者你一次添加文件1,2,3和4? – 2010-08-26 13:05:13

回答

0

我會顯示一些代碼。 Feed的調用發生如下 parseDirectory方法檢查指定文件夾中的所有xmls,並通過調用linkshare操作並傳遞文件名來解析它們。

function index() { 
     set_time_limit(0); 

     #$this->updateFeeds(); 

     App::import('Model', 'Product');   
     $productModel = new Product();  
     # truncate table products before adding new records to avoid duplicate records 
     $productModel->query('TRUNCATE TABLE products'); 

     # parse all files from shareasale 
     #$this->__parsedirectory('feeds/shareasale'); 
     # parse all files from linkshare 
     $this->__parsedirectory('feeds/linkshare'); 

     # send mails where necessary 
     $this->redirect(array('controller' => 'subscriptions', 'action' => 'sendmails')); 
    } 

私有函數

function __parsedirectory($dir) { 
    # retrieve name affiliate out of directory 
    $affiliate = explode('/', $dir); 
    $affiliate = $affiliate[1];  

    $dh = opendir($dir); 
    while (($file = readdir($dh)) !== false) { 
     if ($file != '.' && $file != '..' && !$this->__endswith($file, 'gz')) { 
      $this->requestAction('/parse/' . $affiliate . '/file:' . $file); 
      $this->Session->setFlash($affiliate . '/' . $file . ' parsed'); 
     } 
    } 
    closedir($dh); 
    $this->autoRender = false; 
} 
+0

您應該編輯您的問題,而不是將下一次的答案 – 2010-08-26 13:29:39

+0

哦,我看到 不知道 我會記住它 – Laurent 2010-08-26 13:32:13

0

我認爲問題就出在這部分代碼:

# truncate table products before adding new records to avoid duplicate records 
     $productModel->query('TRUNCATE TABLE products'); 

這是爲了避免重複記錄的好辦法。這應該在DB上進行限制管理。這就是說,不知何故,這一小段代碼在進程中間再次運行。

這是設置爲CRON還是以某種方式自動運行?如果是這樣,那麼發生的是前一個文件在下一個文件開始時還沒有完成解析。

+0

我不會做的TRUNCATE只是避免重複記錄;)在產品表我只想成爲當前在XML Feed中出現的產品。所以我需要將它完全清空,以便它們不會有任何舊記錄;) 這段代碼應該被執行。實際上,它似乎要運行好幾次。問題是爲什麼:) 現在我自動運行它,但目標是在CRON作業投入生產時執行此操作。 我注意到一切順利,當我在我的本地主機上執行相同的腳本。也許有內存問題的東西? – Laurent 2010-08-28 08:57:26

+0

我剛剛注意到這是'function index()',你在瀏覽器中運行這個嗎?如果是這樣,你應該考慮運行它的命令行。我敢打賭,命令行不會有同樣的問題。這可能是在一段時間後,瀏覽器嘗試重新加載頁面。 – 2010-08-28 16:25:41

+0

我在瀏覽器中運行這個是的:)我會給它一個鏡頭,雖然我猜這個問題會持續下去,因爲它在本地主機上運行時會很好。 thx – Laurent 2010-08-29 15:12:45