脚本在一段时间后重新开始执行

时间:2010-08-26 12:49:55

标签: php mysql cakephp bulkinsert

我正忙于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);        
}

有人有经验吗?可能是什么原因以及更多可能是解决方案:)

由于

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我认为问题出在这段代码中:

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

这是一种避免重复记录的糟糕方法。这应该通过对数据库的限制进行管理。话虽如此,不知何故,这段代码正在流程的中间再次运行。

这是设置为CRON还是以某种方式自动运行?如果是这样,发生的事情是前一个文件在下一个文件启动时尚未完成解析。