检查magento是否已运行cronjob

检查magento是否已运行cronjob,magento,Magento,我想使用cronjob导入产品。但问题是,当导入作业同时运行两次时。 我怎样才能避免这些? 我尝试这样做: private function isImportAlreadyRunning() { $isRunning = false; $cronSchecduleCollection = Mage::getModel('cron/schedule')->getCollection() ->addFieldToSelect(array('job_code

我想使用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个进程。类是单例的,因为它属于Helper。

您需要“锁定”数据库。我使用这种函数:

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();

Txn的答案,但如果cronjob停止并从未释放表-如果导入需要太长时间怎么办?很抱歉延迟,我是在度假,但锁是用release_lock释放的,或者当连接关闭时释放的。脚本运行时连接处于活动状态,这意味着如果脚本死亡或终止,连接将关闭,锁将释放。希望能有帮助。如果导入很长,为了数据的一致性,最好不要启动新的导入。如果您的问题是“db是否对所有内容都锁定了?”,答案是否定的,只针对具有此名称的“锁”。Tnx作为答复,但我使用文件锁定解决了此问题:使用负载平衡器可能会很棘手,但并非每个Web商店都需要负载平衡器,因此它也是一个不错的工具:)