2014-09-04 214 views
1

我想使用cronjob導入產品。但問題是當導入作業同時運行兩次時。 我該如何保護這些? 我嘗試這樣做:檢查magento是否已經運行cronjob

private function isImportAlreadyRunning() 
{ 
    $isRunning = false; 
    $cronSchecduleCollection = Mage::getModel('cron/schedule')->getCollection() 
     ->addFieldToSelect(array('job_code', 'status')) 
     ->addFieldToFilter('job_code', array('eq' => 'my_import_products')) 
     ->addFieldToFilter('status', array('eq' => 'pending')) 
     ->addFieldToFilter('executed_at', array('neq' => 'NULL')) 
     ->load(); 

    Mage::log('Cron size: ' .$cronSchecduleCollection->getSize()); 
    if($cronSchecduleCollection->getSize() > 1) 
    { 
     $isRunning = true; 
    } 

    return $isRunning; 
} 

但這些不工作,因爲$ cronSchecduleCollection->的getSize()是等於1,即使我同時運行2個過程。 Class是單身人士,因爲它屬於Helper。

回答

0

您需要「鎖定」數據庫。我使用該種功能:

private function _takeLock() { 
    $result = false; 
    $st = $this->_dbCntr->query('select is_free_lock("BMS_PRODUCT_IMPORT");'); 
    if ($st->fetchColumn() == 1){ 
     $st2 = $this->_dbCntr->query('select get_lock("BMS_PRODUCT_IMPORT", 0);'); 
     $result = $st2->fetchColumn() == 1; 
    } 
    return $result; 
} 

private function _releaseLock() { 
    $this->_dbCntr->query('select release_lock("BMS_PRODUCT_IMPORT");'); 
} 

然後:

 $this->_dbCntr = Mage::getSingleton('core/resource')->getConnection('core_write'); 

     // Take a lock 
     if (!$this->_takeLock()) { 
      return 'Process already running. Aborting'; 
     } 
    process of import 

     $this->_releaseLock(); 
+0

事務處理的答案,但如果停止的cronjob什麼,從不釋放臺 - 的情況下,當進口時間過長? – Milos 2014-09-11 10:47:33

+0

對於延遲感到抱歉,我是在度假,但鎖定是釋放與release_lock或當連接關閉。在腳本運行時,連接處於活動狀態,這意味着如果腳本死亡或被殺死,連接將關閉並釋放鎖定。希望能幫助到你。如果導入很長,那麼最好不要爲數據的一致性啓動一個新導入。如果你的問題是「db是否鎖定了所有內容?」,答案是否定的,只有具有該名稱的「鎖定」纔是。 – 2014-09-23 12:48:04

+0

Tnx的回覆,但我解決了這個問題,使用文件來鎖定:http://stackoverflow.com/questions/10552016/how-to-prevent-the-cron-job-execution-if-it-is-already-running ?lq = 1 – Milos 2014-09-23 13:24:42